2012-02-18 71 views
0

我知道<<運營商用於appending an object to a collection以及string<<操作符對Ruby方法有什麼作用?

<<運算符在下面的代碼片段中做了什麼?

module TriangleBox 
    def available_width 
     height + 25 
    end 
    end 

    Prawn::Text::Box.extensions << TriangleBox 

我發現它在蝦寶石examples頁面。

回答

3

不要認爲它是一個操作符。把它看作是一種有一些語法糖的方法,使它看起來像一個操作符。

代碼

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 
1

你自己說過:它是「將對象附加到集合中」。在這種情況下,對象是模塊TriangleBox,集合是Prawn::Text::Box.extensions,它看起來是Array

1

它將一個項目追加到集合中。

究竟是如何做到這一點,但是,對你來說是隱藏的。這可能是Prawn::Text::Box.extensions只是返回一個常規數組,在這種情況下,它是默認行爲。但它也可能是其他一些班級,而這些蝦人已經編寫了一個自定義的<<運算符來完成安裝擴展所需的任何工作。

不幸的是,沒有簡單的方法可以告訴我們挖掘源代碼的難度,找出Prawn::Text::Box.extensions的類是什麼,然後如果它定義了定製的函數<<。幸運的是,這是所有開源的github上...

希望有幫助(和好運,如果你去挖掘)!