2011年10月 8日

[ruby-list:48444] Re: 関数の戻り値について

信岡です。

> 私がわからないのはケース.3なのですが
> Rubyは最後に評価された値を返すはずですから
> 10を期待していましたが
> 結果はsplitされた文字の配列でした。
> また、ケース.2ではresult = 0が評価されていると言う結果なのに
> ケース.3ではその行すらも評価されないというのが2重にわかりませんでした。


文面から察するに、ケース 3 の calc メソッドの中で最後に評価される式が
splitprm.each メソッドに渡されたブロックの中の
result += c.to_i
であると思っているのではないかと思いますが、それは正しくありません。
calc メソッドの中で最後に評価される式は
splitprm.each do |c|
result += c.to_i
end
です。 すなわち splitprm.each というメソッド呼び出しの返り値がそのまま
calc メソッドの返り値になります。
(そして Array#each メソッドは self を返すので、calc メソッドの返り値は splitprm の
参照先と同一です。)

以下のように書き換えるとわかりやすいのではないでしょうか。

ケース 3' (ケース 3 とほぼ等価)
def calc( prm )
splitprm = prm.split( // )
result = 0
b = Proc.new{ |c| result += c.to_i }
splitprm.each( &b )
end

> これはバグなのでしょうか?仕様なのでしょうか?

そんなわけなんでバグではないですね。

--
信岡 ゆう (NOBUOKA Yu)


投稿者 xml-rpc : 2011年10月 8日 02:18
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/106829
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。