вступление

Всем привет! У меня появился интерес к метапрограммированию на Ruby — поэтому я хочу написать об этом. Предстоит осветить тонну, поэтому я собираюсь сделать серию коротких постов. Вот так!

Метод #отправить

Знаете ли вы, что вы можете выполнить метод для любого объекта Ruby, передав имя метода в виде символа в качестве аргумента методу #send?

Давай попробуем!

001 > 1.send(:to_s)
 => "1" 
002 > "hello".send(:upcase)
 => "HELLO"

Мы собираемся оставить #send на данный момент, но это может быть полезно позже!

Определение классов

Обычно, когда мы определяем классы в Ruby, код выглядит примерно так:

class Cat
end

Но мы также можем определить классы следующим образом:

Cat = Class.new

В Ruby имена классов являются константами, а это значит, что мы установили константу Cat, равную Class.new. Но у нас есть способы метапрограммирования для установки констант!

Установка констант

Мы можем установить константы, используя метод #const_set в классе:

009 > Cat.const_set("NOISE", "Meow")
 => "Meow" 
010 > Cat::NOISE
 => "Meow"

Если мы хотим установить константу верхнего уровня, мы можем вызвать #const_set в классе Object. Объединив это с тем, что мы только что узнали, мы можем вывести новый синтаксис для определения классов:

Object.const_set("Cat", Class.new)

Но почему это полезно? Мы можем создать много классов, быстро!

new_classes = ["Cat", "Dog", "Bird"]
new_classes.each do |class_name|
    Object.const_set(class_name, Class.new)
end

Это конец первой части — следите за обновлениями, чтобы определить методы и начать писать библиотеки!