次のようなコードを見てきました。
def some_method
# ...
end.another_method
その部分は何をしend.another_method
ますか?
ここで行っているのは、メソッドを定義し、メソッド定義の結果に対してメソッドを呼び出すこと (メソッド呼び出しではない) であるため、あなたの例は間違っていると思います。これは常に (通常は?)nil
です。
fmendez が参照している同様の形式がありますがend
、その場合はメソッド定義ではなく、ブロックの終わりです。
たとえば、次のようになります。
array.map do |element|
element * element
end.sum
仮説的には、指定された配列の要素の二乗和を返します。
ただし、このようにメソッドチェーンを実行している場合は、 の代わりにブラケットスタイルのブロックを使用する方が一般的でdo..end
あるため、上記の例は次のようになります。
array.map{ |element|
element * element
}.sum
Ruby のブロックはメソッドの引数であり、(専用構文を除いて) 他のメソッド引数とend
同じです)
。
'hello'.concat(' world!').capitalize
これもメソッドチェーンの例です。
Ruby では、.
はメッセージ送信オペレーターです。(他の言語では、代わりにメソッド呼び出し演算子と呼ばれます。)
foo.bar
「評価して、評価結果にfoo
メッセージを送る」という意味です。bar
foo
この特定のケースではanother_method
、評価の結果にメッセージを送信しています
def some_method; end
Ruby 言語仕様では、メソッド定義式の値は未定義であり、無視する必要があると規定されています。また、ほとんどの Ruby 実装では、メソッド定義式は単純に に評価されますがnil
、これはあまり役に立ちません。
ただし、一部の実装では、メソッド定義式はよりも便利なものに評価されますnil
。たとえば、Rubinius では、CompiledMethod
定義されているメソッドのオブジェクトに評価されます。またCompiledMethod
、豊富な API を備えているため、CompiledMethod
オブジェクトにメッセージを送信することは間違いなく理にかなっています。
Symbol
メソッド定義式は、定義されているメソッドの名前またはMethod
オブジェクトに対応する を返す必要があることも提案されています。
簡単に言えば、この特定の場合のドットは、Ruby で常に意味するものとまったく同じことを意味します。つまり、メッセージを送信し、メソッドを呼び出し、メンバー関数を呼び出します。呼び出したいものは何でも。