вступление
Всем привет! У меня появился интерес к метапрограммированию на 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
Это конец первой части — следите за обновлениями, чтобы определить методы и начать писать библиотеки!