Недавно я столкнулся с конструкцией Ruby EOB
/-EOB
в этом контексте (из Ruby библиотека id3):
def initialize(...)
# ...
instance_eval <<-EOB
class << self
def parse
# ...
# Method code
# ...
end
EOB
self.parse # now we're using the just defined parsing routine
# ...
end
Я понимаю, что код используется для создания метода на лету, но я хотел бы знать, можно ли использовать фрагмент EOB
в методе. Я хотел бы написать метод, который генерирует код другого метода, который должен быть включен в еще один класс. Это звучит немного запутанно, я попытаюсь проиллюстрировать свое намерение несколькими упрощенными примерами кода:
# This class reads the code of another
# Ruby class and injects some methods
class ReadAndInject
# The method which defines another method
def get_code_to_be_injected
"\tdef self.foo\n"+
"\t\tputs 'bar'\n"+
"\tend\n"
end
# Main entry point, reads a generated Ruby Class
# and injects specific methods within it
def read_and_inject
# Assume placeholder for currently read line,
# add the generated code within
current_line += "\n#{get_code_to_be_injected}"
end
end # class ReadAndInject
Это будет работать, так как метод для внедрения добавлен правильно. Тем не менее, мне было интересно, даст ли использование конструкции EOB
некоторые преимущества (например, лучшую видимость кода, поскольку не нужно будет добавлять громоздкие вкладки или конкатенации строк).
В заключение, это хороший вариант использования для EOB
? Это похоже на сомнительную, но мощную конструкцию, я уклонился от нее, погуглил и переполнил стек, но никаких значительных примеров кода, других чем один из RubyCocoa вернулся. Я только недавно начал использовать метаконструкции в Ruby, так что будьте осторожны :-)
Заранее спасибо!