关于Ruby的一般问题

时间:2009-03-03 02:37:11

标签: ruby-on-rails ruby acts-as-versioned

我已经在我的rails应用程序中安装了github.com的acts_as_versioned插件,并且有一段我不完全理解的代码,我希望有人可以为我清除这个

class_eval <<-CLASS_METHODS
  def a_bunch_of_stuff
   ....
  end
CLASS_METHODS

我得到了块内的方法(或者它是什么)被定义为类中的实例方法,但我找不到CLASS_METHODS在插件中的任何地方定义为常量,而且我也不确定是什么&lt;&lt; - 在class_eval之后表示。插件位于here,有问题的代码从lib / acts_as_versioned.rb的第199行开始。如果有人会给我这里的低调,我会非常感激。

THX

-C

3 个答案:

答案 0 :(得分:7)

这是一个heredoc。 http://en.wikipedia.org/wiki/Heredoc#Ruby

匹配的CLASS_METHODS标记本质上是开始和结束引号。如果使用&lt;&lt; - 而不是&lt;&lt ;,则结尾标记可以用空格缩进。

你可以在Ruby中同时使用多个heredocs(我让我的heredocs与参数名称相同,但这只是为了审美 - 它没有区别):

def define_with_description description, code
  puts "defining a method to #{description}"
  class_eval code
end

define_with_description <<-DESCRIPTION, <<-CODE
  set up us the bomb
DESCRIPTION
  Bomb.new.set_up(us)
CODE

答案 1 :(得分:6)

这是"here document",这是一种引用内联大型多行字符串的方法。来自Programming Ruby

  

字符串可以在多个输入行中继续,在这种情况下,它们将包含换行符。也可以在这里使用文档来表示长字符串文字。每当Ruby解析序列<<identifier<<quoted string时,它就会用从连续逻辑输入行构建的字符串文字替换它。当它找到以标识符或带引号的字符串开头的行时,它会停止构建字符串。您可以在<<个字符后立即添加减号,在这种情况下,终结符可以从左边距缩进。如果使用带引号的字符串来指定终止符,则其引用规则将应用于此处的文档;否则,适用双引号规则。

这将导致class_evalCLASS_METHODS之间的内容视为字符串,并在适当的上下文中执行它。使用名称CLASS_METHODS是任意的,它可以很容易地被称为其他任何东西。

答案 2 :(得分:-2)

这些是等价的:

class SomeClass
  class_eval <<-CLASS_METHODS
    def first_method
    end
    def second_method
    end
  CLASS_METHODS
end

class SomeClass
  def self.first_method
  end
  def self.second_method
  end
end