7

次のようなコードを見てきました。

def some_method
  # ...
end.another_method

その部分は何をしend.another_methodますか?

4

2 に答える 2

11

ここで行っているのは、メソッドを定義し、メソッド定義の結果に対してメソッドを呼び出すこと (メソッド呼び出しではない) であるため、あなたの例は間違っていると思います。これは常に (通常は?)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

これもメソッドチェーンの例です。

于 2013-04-19T18:04:28.087 に答える
8

Ruby では、.メッセージ送信オペレーターです。(他の言語では、代わりにメソッド呼び出し演算子と呼ばれます。)

foo.bar

「評価して、評価結果にfooメッセージを送る」という意味です。barfoo

この特定のケースではanother_method、評価の結果にメッセージを送信しています

def some_method; end

Ruby 言語仕様では、メソッド定義式の値は未定義であり、無視する必要があると規定されています。また、ほとんどの Ruby 実装では、メソッド定義式は単純に に評価されますがnil、これはあまり役に立ちません。

ただし、一部の実装では、メソッド定義式よりも便利なものに評価されますnil。たとえば、Rubinius では、CompiledMethod定義されているメソッドのオブジェクトに評価されます。またCompiledMethod、豊富な API を備えているため、CompiledMethodオブジェクトにメッセージを送信することは間違いなく理にかなっています。

Symbolメソッド定義式は、定義されているメソッドの名前またはMethodオブジェクトに対応する を返す必要があることも提案されています。

簡単に言えば、この特定の場合のドットは、Ruby で常に意味するものとまったく同じことを意味します。つまり、メッセージを送信し、メソッドを呼び出し、メンバー関数を呼び出します。呼び出したいものは何でも。

于 2013-04-19T18:18:32.223 に答える