From: vzx01036@... Date: 2011-10-08T02:21:19+09:00 Subject: [ruby-list:48445] Re: 関数の戻り値について 下田さんの書かれたケース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" >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)