2009-01-15練習:たのしいRuby
P.203 (1) square メソッドを定義する
数値からなる配列 nums に対して、その個々の要素を自乗した要素からなる 配列を返すメソッド square を 3 通りの方法で定義しましょう。
(a) collect を使う
def square1(nums) nums.collect{|i| i**2 } end nums = [1, 3, 5, 7, 9] p square1(nums)
実行結果
[1, 9, 25, 49, 81]
(b) collect は使わず、each を使う
def square2(nums) result = [] nums.each{|i| result << i**2 } return result end nums = [2, 4, 6, 8, 10] p square2(nums)
実行結果
[4, 16, 36, 64, 100]
(c) collect も each も使わず、インデックスと[ ]を使う
def square3(nums) nums.each_index{|index| nums[index] **= 2 } end nums = [1, 9, 25, 49, 81] p square3(nums)
実行結果
[1, 81, 625, 2401, 6561]
引数 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 を見つけ、これを使いました。
マニュアルを読んで使い方を理解したつもりだったのですが、まだまだですね。