Варианты использования для конструкции EOB Ruby - PullRequest
1 голос
/ 27 июня 2011

Недавно я наткнулся на конструкцию 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? Это похоже на теневую, но мощную конструкцию, я приглушил , googled и stackoverflow'd, но при этом не было возвращено никаких существенных примеров кода, кроме из RubyCocoa . Я только недавно начал использовать мета-конструкции в Ruby, поэтому будьте осторожны: -)

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

1 Ответ

3 голосов
/ 27 июня 2011

Они называются "здесь документы" , которые поддерживаются несколькими языками и позволяют создавать многострочные строки.Вы можете использовать любой разделитель, а не только EOB.В Ruby есть некоторые дополнительные функции для heredoc: например, - в <<-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
...