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円〜で好評発売中! ===

M’ELBORNE BOOKS

rack pack8 ruby_parallel



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS