我最近遇到了这个上下文中的RubyEOB/-EOB构造(来自Rubyid3 library):

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的一个好用例吗?
这似乎是一个阴暗但强大的构造,我已经ducked它,google和stackoverflow'd它还没有返回除了one from RubyCocoa以外的重要代码样本。我最近才开始在Ruby中使用元结构,所以请小心:-)
提前谢谢!

最佳答案

它们被称为"here documents",由多种语言支持,允许您生成多行字符串。实际上,您可以使用任何分隔符,而不仅仅是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

关于ruby - Ruby的EOB构造的用例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6486891/

10-13 03:47