我已经在我的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
答案 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_eval
将CLASS_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