04 April 2014
Rubyのメソッド引数は奥が深い
Rubyのメソッド引数は、デフォルト値がセットできたり、可変長引数にできたり、キーワード引数を渡せたり、多彩なわけですが。今日、tcoというターミナル出力に色を付けるライブラリのソースを眺めていたら、面白い引数の使い方に出会って。ちょっとこれ問題にしてみようかと。もしかしたら常識かもしれません。
─ 問題1 ─
配列を取り最初の3つの要素だけを返すメソッドfirst_three
を定義しなさい。具体的には、以下の挙動になる。
first_three 1 # => [1, nil, nil]
first_three [1] # => [1, nil, nil]
first_three [1, 2] # => [1, 2, nil]
first_three [1, 2, 3, 4, 5] # => [1, 2, 3]
─ 問題2 ─
二次元配列values
を取り、奇数番目(先頭を0番として)の各要素の真ん中の値の合計値を返すメソッドsum_of_odd_mid
を定義しなさい。
values = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
sum_of_odd_mid(values) # => 33
少し下に解答例を置いておきます。
─ 解答例1 ─
def first_three((a, b, c))
[a, b, c]
end
first_three 1 # => [1, nil, nil]
first_three [1] # => [1, nil, nil]
first_three [1, 2] # => [1, 2, nil]
first_three [1, 2, 3, 4, 5] # => [1, 2, 3]
─ 解答例2 ─
values = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
def sum_of_odd_mid((_,(_,v1,_),_,(_,v2,_),_,(_,v3,_)))
v1 + v2 + v3
end
sum_of_odd_mid(values) # => 33
何れの例でも、引数定義において括弧を使って配列展開しています。ブロック引数での配列展開はよくやりますが、メソッド引数でもできるんですね。ちなみにtcoライブラリでは次のような使い方をしていました。
module Tco
def self.decorate(string, (fg, bg, bright, underline))
@colouring.decorate string, [fg, bg, bright, underline]
end
end
やあ、Rubyのメソッド引数は奥が深い。
=== Ruby関連電子書籍100円〜で好評発売中! ===
blog comments powered by Disqus