2016-11-08 3 views
0

クラスや変数が1つ以上のメソッドにチェーンされているのでしょうか?それはどの戻り値ですか? (Class.method1.method2 - >戻り値は何ですか?)メソッド連鎖の場合、どの戻り値が返されるかはどのように決定できますか?

は、以下の次のコードを考える:この場合

restaurants = [] 
restaurants << Restaurant.new.import_line(line.chomp) 

def import_line(line) 
return self 
end 

を、両方の方法(newimport_line(line)はインスタンスを返すので、私は、インスタンスを入れます知っていますimport_line(line)場合かかわら配列に。私は好奇心、Restaurant.new.import_line(line.chomp)の戻り値になり何true

def import_line(line) 
    return true 
end 

のようなものを返していました。それが0に設定されますまたはインスタンスを返します(.newインスタンスを返します)?

本質的に、Class.method1.method2またはが存在する場合、どのメソッドが戻り値を決定するのが優先されますか?

ご協力いただければ幸いです!

答えて

2

戻り値はです。常に最後のものは例外ではありません。結果は必ずしもあなたが期待していたものではありませんが、チェーンの最後のものはやりにくいものがあるかもしれません。

例えば、単に明確にする:

Restaurant.new.import_line do |line| 
    line + '!' 
end 

はそのブロックの結果を返すために、ここでimport_lineのための義務はありません、それは場合は、それはしませんが多いのです。

連鎖しているものが完全に切り替わり、ガードを解除することもあります。呼び出し元のチェーンの各関数の戻り値を確認する必要があります。

ここに例:あなたがそのような場合には、それをチェーンできないことを意味している場合、文字列を返し、変更が行われた場合にのみ、gsub!この場合

"help!".gsub!(/!/, '?').length 
# => 5 

"help?".gsub!(/!/, '?').length 
#! NoMethodError: undefined method `length' for nil:NilClass 

、そうでない場合nil、。

+2

@tadmanでうまく答えました。もう少し進むために、 'object.method1.method2.method3'を実行すると、' object.method1'の結果は 'method2'が呼び出されたオブジェクトになり、結果は' method3'のオブジェクトになりますが呼び出され、その結果が元の呼び出し元に返されます。 – moveson

+0

優れた分析@movesonとありがとう、おまえは。 – the12

関連する問題