2012-02-18 21 views
0

私は<<を知っています。appending an object to a collectionstringの演算子が使用されています。<<演算子はルビメソッドで何をしますか?

次のコードスニペットで<<オペレータをしませんか?

module TriangleBox 
    def available_width 
     height + 25 
    end 
    end 

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

私はこれをPrawn gem 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の上のすべてのオープンソースです...

希望(あなたが掘りに行く場合は、幸運)助けています!

関連する問題