Введение: Эпи 1

Привет ! Всем, сегодня мы поговорим об удивительной функции метапрограммирования в Ruby.

Метапрограммирование в целом - это языковая функция, с помощью которой вы пишете код, который пишет код. Метапрограммирование - это, по сути, написание кода, который пишет код.

Но разве не этим занимаются генераторы кода и компиляторы? Например, вы можете написать аннотированный код Java, а затем использовать генератор кода для вывода файлов конфигурации XML.

В широком смысле это поколение XML является примером метапрограммирования. Фактически, многие люди думают о генерации кода, когда встречается слово «м».

Сегодня мы увидим своего рода метапрограммирование, при котором программа будет меняться во время выполнения.

Одно из общественного мнения; «Метапрограммирование - дело знатока; новички и средний уровень должны держаться от него подальше ».

Но я не поддерживаю эту идею. Его легко освоить, он используется во всем, что вы используете в повседневной работе.

В этой серии видеороликов мы постараемся охватить все аспекты метапрограммирования от introspection до method_missing и так далее.

Самоанализ

В этом выпуске мы поговорим о функции Ruby Introspection.

«Исследование или наблюдение за собственными умственными и эмоциональными процессами», «Медитация»

Во многих языках программирования языковые конструкции больше похожи на призраков, чем на выдуманных граждан: вы можете видеть их в исходном коде, но они исчезают до запуска программы.

Возьмем, к примеру, C ++. Когда компилятор завершил свою работу, такие вещи, как переменная и метод, потеряли свою конкретность; они просто места в памяти. Если бы вы когда-либо преобразовывалиC кодов в язык ассемблера, вы бы знали, что никогда не видите упоминаний написанных вами идентификаторов.

Вы не можете запросить у класса методы экземпляра, потому что к тому времени, когда вы зададите вопрос, класс уже исчез.

На других языках, таких как Ruby, среда выполнения больше похожа на загруженный рынок. Большинство языковых конструкций все еще существуют и гудят повсюду. Вы даже можете подойти к конструкции и задать ей вопросы о самой себе. Это называется самоанализ.

Мы будем использовать irb перехват выполнения, чтобы задавать вопросы объектам во время выполнения. Мы также можем использовать pry gem для выполнения этой работы; На самом деле так удобнее.

Открытый класс: Эпи 2

Привет! В этом выпуске мы поговорим об удивительной функции Ruby OpenClass. Открытый класс - замечательная функция Ruby, которая позволяет добавлять поведение к уже существующим классам. Представьте, что это открытый мешок, в который можно складывать новые или заменять предметы. Поскольку в Ruby нет таких этапов, как compile time, `Linking time`, есть только Runtime. Таким образом, можно сказать, что Open Class позволяет изменять содержимое классов в среде выполнения.

В Ruby классы всегда открыты для модификации. Ruby позволяет добавлять поведения к уже определенным классам из любого места. Это не ограничивается только пользовательскими классами, кроме того, это применимо ко всем встроенным классам, таким как Array, Object and the Class class сам.

# Ruby on Rails adds new methods to BuiltIn classes
class Fixnum
  def hours
    self * 3600 # number of seconds in an hour
  end
  alias hour hours
end

Есть много примеров добавленного поведения, которое нам нравится в рельсах. Например, .years, .minute, .seconds, .present?, .blank? и т. Д.

Что происходит со старым поведением при перезаписи?

Когда вы сознательно или неосознанно перезаписываете ранее существовавшее поведение / методы, не останется никаких следов более старой версии поведения.

Исправление обезьян

Это термин, используемый Ruby-программистом, когда вы пишете свою версию патча для любого поведения, ранее существовавшего в какой-либо библиотеке, которая вам не принадлежит.

У этой техники есть как преимущества, так и недостатки, заключающиеся в том, что она ломает всю систему и никогда не узнает, что произошло.

Практический пример использования

Скажем, вам нужно отображать журналы в STDOUT разным цветом для разных уровней журналов. Например, red для ошибок, blue информация, pink для предупреждения. Итак, вы сделали для этого разные функции.

Код в предыдущем примере не так объектно-ориентирован. Функции разбросаны по всему приложению. Итак, есть причина, по которой возникла идея ООП. Ruby - чистый объектно-ориентированный язык. Следовательно, нам нужно использовать эту функцию Ruby.

В этом примере я использую разные стандартные потоки для отправки обычных журналов и журналов ошибок. Вам необходимо изучить эту отраслевую практику.

Советы

Ruby обрабатывает обычный код и class или module код определения одинаково, но не одинаково. Нравится

Совет: 2

@instance_variables не определены в объектах, пока вы не вызовете какой-либо метод, который их устанавливает. Например; у вас могут быть разные объекты-братья с разными наборами @instance_variables. Вы можете попробовать это.

Как выполняется 3 раза путы?

Поскольку класс также является объектом classClass, его необходимо создавать, как обычные объекты, которые вы создаете.

Предостережения

Когда вы вносите изменения в глобальную область видимости, это может сломать что-то в библиотеках, которые вы используете в своем приложении.

Или, хотя это и не вредит, возникает один вопрос - стоит ли раздувать глобальный масштаб? Возможно, вам понадобится эта функция в какой-то конкретной области. Вы можете использовать технику «Одноэлементный метод», чтобы ограничить область действия. Возможный способ - использовать уточнения Ruby.

Доработки: Epi 3

В предыдущем выпуске мы узнали об «открытом классе» и его побочных эффектах.

Чтобы уменьшить негативное влияние Monkey Patching на других пользователей класса monkey-patched, на помощь приходит Refinements. Уточнения позволяют расширить класс локально.

Что нужно иметь в виду: -

  • Уточнения можно делать только для классов, но не для модулей.
  • активируется методом using

Модуль может иметь несколько уточнений для нескольких классов. Модуль # уточнение создает отдельные анонимные модули, которые содержат изменения или уточнения классов.

Сфера

Уточнения можно активировать на верхнем уровне (как в примере выше), внутри классов или модулей. Но вы не можете активировать уточнения в области действия метода.

  • Уточнения активны до конца текущего класса, модуля или текущего файла (если используются на верхнем уровне).
  • когда управление передается за пределы области, уточнение деактивируется.