Hatena::Grouprubyist

Ruby初心者prinyの学習帳 RSSフィード

2009-01-15練習:たのしいRuby

P.203 (2) sum_array メソッドを定義する

17:57

数値からなる配列 nums1 と nums2 に対して、それらの個々の要素を足し合わせた
要素からなる配列を返すメソッド sum_array を定義しましょう。

書いたもの

def sum_array(ary1, ary2)
  result = []
  ary1.zip(ary2){|a, b|
    result << a + b
  }
  return result
end


nums1 = [1, 2, 3]
nums2 = [4, 5, 6]
p sum_array(nums1, nums2)

実行結果

[5, 7, 9]

rochefort さんの日記 を見て、zipmap を使えば、もっとすっきり書けることを知った。なるほどねぇ。

あと、ためしに、要素数が異なる配列を足してみた。案の定、ary1 のほうが少ないときは ary1 と同じ要素数の配列が返ってきたけど、ary1 のほうが多いときは、nilFixnum は足せないよ、というエラーが返ってきた。

このメソッドで足せるかどうかを事前にチェックすることも考えた。チェックするなら、配列の要素数が同じか、と、配列の要素が数値オブジェクトだけか、の 2 つかな。でも、チェックを入れると、その分、sum_array するのに時間がかかるし、いまいちかも。で、やっぱり、要素数が異なる配列を足そうとしたときなどのエラーは、実行時のエラーにお任せすることにした。

holysugarholysugar2009/01/15 18:41square3 は、引数を直接書き換えてるので nums が変わってしまってるのに注意。意図してないなら dup しましょう。

prinypriny2009/01/16 12:16コメントをありがとうございます。

引数 nums を書き換えることは意図したことではないです。手元のものは以下のように修正しました。
def square3(nums)
copy = nums.dup
copy.each_index{|index|
copy[index] **= 2
}
end

蛇足ですが、square3 は、最初はこんなふうに書いていました。
def square3(nums)
indexes = (0...nums.size).to_a
result = []
while index = indexes.shift
result << nums[index] ** 2
end
return result
end

これなら、nums を書き換えてはいなかったです。
インデックスの配列をわざわざつくらなくても、Ruby にはインデックスに対して何かをするメソッドがあるのではと思っていたところ、Array#each_index を見つけ、これを使いました。
マニュアルを読んで使い方を理解したつもりだったのですが、まだまだですね。

JaylynJaylyn2011/09/07 23:20For the love of God, keep wrtinig these articles.

dpjpqedpjpqe2011/09/08 17:10ixKdgy <a href="http://xdjlmaumrzcn.com/">xdjlmaumrzcn</a>

imxcoxzuoaimxcoxzuoa2011/09/08 21:20BJJecy , [url=http://iqgvfnjxkrzr.com/]iqgvfnjxkrzr[/url], [link=http://sfennuokytve.com/]sfennuokytve[/link], http://fqcppptoavml.com/

ddoswzjzmlfddoswzjzmlf2011/09/10 22:29WSfJpC , [url=http://vvcezykqtqef.com/]vvcezykqtqef[/url], [link=http://swrdvfffiyzf.com/]swrdvfffiyzf[/link], http://cuhxnihbjgsq.com/