我知道appending an object to a collection和string都使用<<运算符。
在下面的代码片段中,<<操作符做了什么?
module TriangleBox
def available_width
height + 25
end
end
Prawn::Text::Box.extensions << TriangleBox我在对虾宝石的examples页面上找到的。
发布于 2012-02-18 12:13:13
不要把它想成一个运算符。可以把它看作是一种方法,它有一些语法糖,使它看起来像一个操作符。
代码
Prawn::Text::Box.extensions << TriangleBox实际上是在调用
Prawn::Text::Box.extensions.<<(TriangleBox)这个方法是做什么的?简而言之,如果不阅读Prawn的文档就无法判断(尽管我们可以猜测这是通过添加一个扩展的模块来覆盖默认的available_width方法)。您可以定义<<方法来做任何您想做的事情。
class Silly
def <<(anything)
puts "I hate chicken"
end
end
a = Silly.new
a << 73
=> I hate chicken发布于 2012-02-18 12:08:48
你自己也说过:它是“将一个对象追加到一个集合中”。在本例中,对象是模块TriangleBox,集合是Prawn::Text::Box.extensions,它看起来像是一个Array。
发布于 2012-02-18 12:10:00
它是将一项追加到集合中。
然而,它到底是如何做到这一点的,对你来说是隐藏的。可能Prawn::Text::Box.extensions只是返回一个常规数组,在这种情况下,这是默认行为。但也可能是因为它是另一个类,而对虾团队已经编写了一个自定义的<<操作符来执行安装扩展所需的任何工作。
不幸的是,除了深入研究源代码,找出Prawn::Text::Box.extensions的类是什么,然后它是否定义了自定义的<<函数之外,没有简单的方法来判断。幸运的是,它在github上都是开源的……
希望这会有帮助(如果你去挖掘的话,祝你好运)!
https://stackoverflow.com/questions/9338372
复制相似问题