Варианты использования конструкции EOB в Ruby

Недавно я столкнулся с конструкцией 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, так что будьте осторожны :-)

Заранее спасибо!


person Dr1Ku    schedule 26.06.2011    source источник
comment
EOB — это просто еще один способ определить строку. В вашем get_code_to_be_injected нет новых строк (или ; для разделения команд), поэтому я ожидаю ошибки, потому что это недопустимый рубин. Чтобы ответить на ваш вопрос: да, я бы использовал такое определение строки.   -  person knut    schedule 27.06.2011
comment
@knut, да точно. Может называться линейно-ориентированным строковым литералом или документом ЗДЕСЬ: ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/   -  person miku    schedule 27.06.2011
comment
@knut Правда, забыл добавить новые строки, редактирую. Итак, это просто еще один способ определения многострочной строки. Вы можете добавить его в качестве ответа, если хотите. Спасибо за быстрый ввод!   -  person Dr1Ku    schedule 27.06.2011
comment
@miku Спасибо за ссылку на документацию, хороший материал!   -  person Dr1Ku    schedule 27.06.2011
comment
Вы можете найти хороший пример в геме mustache_rails3 (см. ).   -  person fyr    schedule 27.06.2011
comment
@Dr1Ku Поиск ‹‹EOT дает хорошие результаты.   -  person Josh Lee    schedule 27.06.2011


Ответы (1)


Они называются "здесь документы", которые поддерживаются несколькими языками и позволяют создавать многострочные строки. На самом деле вы можете использовать любой разделитель, а не только EOB. В Ruby есть несколько дополнительных функций для heredocs: например, - в <<-EOB позволяет сделать отступ разделителя.

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

def code_to_be_injected
  <<-EOS
    def self.foo
      puts 'bar'
    end
  EOS
end

Некоторые дополнительные функции в Ruby:

myvar = 42
<<EOS
variable: #{myvar}
EOS #=> "variable: 42"

<<'EOS'
variable: #{myvar}
EOS #=> "variable: #{myvar}"

print <<A, <<B
This will appear first
A
and this second
B
person jtbandes    schedule 26.06.2011
comment
Да, в самом деле. Спасибо за отзыв! - person Dr1Ku; 27.06.2011
comment
Отредактировал мой ответ, включив в него еще несколько интересных примеров! - person jtbandes; 27.06.2011
comment
Захватывающе? Вам нужно больше гулять :) - person mu is too short; 27.06.2011
comment
О чем ты говоришь? Клянусь, я не сидел за компьютером все выходные. : P (Связано: будь ты проклят, ограничение ежедневной репутации!) - person jtbandes; 27.06.2011
comment
@jtbandes Блин, есть такое? Добавляется ли после этого дополнительная репутация? Был бы облом, если бы этого не было. Самое изысканное использование 42 выше! ..и то же самое, хотя я отсутствовал по делам ^_^ - person Dr1Ku; 27.06.2011