我在我的rails应用程序中安装了github.com的acts_as_versioned插件,并且有一段我不完全理解的代码,我希望有人可以为我清除这个
class_eval <<-CLASS_METHODS def a_bunch_of_stuff .... end CLASS_METHODS
我得到了块中的方法(或者它是什么)被定义为类中的实例方法,但我找不到CLASS_METHODS在插件中的任何地方定义为常量,而且我也不确定是什么<< - 在class_eval之后意味着.插件位于此处,相关代码从lib/acts_as_versioned.rb的第199行开始.如果有人会给我这里的低点,我会非常感激.
谢谢
-C
这是一个heredoc.http://en.wikipedia.org/wiki/Heredoc#Ruby
匹配的CLASS_METHODS标记基本上是起始和结束引号.如果使用<< - 而不是<<,则结尾标记可以用空格缩进.
你可以在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
这是一个"here document",它是一种引用内联大型多行字符串的方法.来自编程Ruby:
字符串可以在多个输入行中继续,在这种情况下,它们将包含换行符.也可以在这里使用文档来表示长字符串文字.每当红宝石解析序列
<
或 <
,将其与从连续逻辑输入线字面内置的字符串替换它.当它找到以标识符或带引号的字符串开头的行时,它会停止构建字符串.你可以在 <<
字符后面加一个减号,在这种情况下,终结符可以从左边距缩进.如果使用带引号的字符串来指定终止符,则其引用规则将应用于此处的文档; 否则,适用双引号规则.
这将导致class_eval
将它们CLASS_METHODS
作为字符串处理并在适当的上下文中执行它.名称的使用CLASS_METHODS
是任意的,它可以很容易被称为其他任何东西.