[#48450] 1.8.7と1.9.2の挙動の違いについて — "Jun'ya Shimoda" <jun-shimo@...>

下田です。

13 messages 2011/10/09

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

From: vzx01036@...
Date: 2011-10-07 17:21:19 UTC
List: ruby-list #48445
下田さんの書かれたケース3を

return splitprm.each {|c| result += c.to_i}

と書き換えると、何が発生しているか、お分かりになるのではないでしょうか。

あくまでも最後に評価されているのは、「splitprm」であって、期待している「result
」ではないわけです。

少し乱暴な言い方をすると、ケース3は、

splitprm(配列)の中身をごちゃごちゃやりましたが、最終的には、splitprm の値を
返します

との記述になっています。

個人的には、何を返事するかは、オブジェクト指向として大切なことだと思っているの
で、「return」で返事の内容を明示することをお勧めしたいのですが……。


----- Original Message -----
>Date: Sat, 8 Oct 2011 01:30:33 +0900
>From: "Jun'ya Shimoda" <jun-shimo@nifty.com>
>Subject: [ruby-list:48443] 関数の戻り値について
>To: ruby-list@ruby-lang.org (ruby mailing list)
>
>
>下田です。
>
>初心者プログラマーをRuby信者にしてしまおうと色々教えてたら
>変な挙動なのではないかと思われる事があったので報告します。
>
>理解不足な点はご教示いただけると幸いです。
>
>
>ケース.1
>def calc(prm)
>   prm.split(//)
>end
>
>ケース.2
>def calc(prm)
>   prm.split(//)
>   result = 0
>end
>
>ケース.3
>def calc(prm)
>   splitprm = prm.split(//)
>   result = 0
>   splitprm.each do |c|
>     result += c.to_i
>   end
>end
>
>ケース.4
>def calc(prm)
>   splitprm = prm.split(//)
>   result = 0
>   splitprm.each do |c|
>     result += c.to_i
>   end
>   result
>end
>
>
>以上の4ケースを
>printf (calc ARGV[0]).to_s + "\n"
>で呼び出しました。
>
>ruby1.8.7(2008-08-11 patchglevel 72) [i386-cygwin]
>と
>ruby1.9.2p290(2011-07-09 revision 32553) [x86_64-linux]
>で試してみたところ
>
>
>ケース.1
>1234(1.8.7)
>["1", "2", "3", "4"](1.9.2)
>
>ケース.2
>0
>
>ケース.3
>1234(1.8.7)
>["1", "2", "3", "4"](1.9.2)
>
>ケース.4
>10
>
>
>となりました。
>私がわからないのはケース.3なのですが
>Rubyは最後に評価された値を返すはずですから
>10を期待していましたが
>結果はsplitされた文字の配列でした。
>また、ケース.2ではresult = 0が評価されていると言う結果なのに
>ケース.3ではその行すらも評価されないというのが2重にわかりませんでした。
>
>これはバグなのでしょうか?仕様なのでしょうか?
>
>以上よろしくお願いします。
>
>
>-- 
>  A   A         Name   : 下田 純也 (Jun'ya Shimoda)
>(o'.'o) _/     e-mail : jun-shimo@nifty.com
>(>  ~<)/       Blog   : http://d.hatena.ne.jp/JironBach/
>                Twitter: http://twitter.com/JironBach/
>
>

とみくらまさや(vzx01036@nifty.com)


In This Thread