なんか仮引数がめっちゃ多くなって、その仮引数に対して実引数全部書いてたんですよね。
例えば、こんな感じで。
[11] pry(main)> def func(a, b, c, d, e, f, g)
[11] pry(main)* a + b + c + d + e + f + g
[11] pry(main)* end
[12] pry(main)> func(1, 2, 3, 4, 5, 6, 7)
=> 28
とまぁ期待する値は返ってくるんですが、引数増えたらくそほどめんどいじゃないですか?
ってことなので、この引数地獄から俺を解き放ってくれって感じで、なにか良い方法ないかなって探したらありました。
キーワード引数を使って、実引数をハッシュで渡してやる方法です。
まずは、仮引数をキーワード引数の形に直しましょう。
[8] pry(main)> def func(a:, b:, c:, d:, e:, f:, g:)
[8] pry(main)* a + b + c + d + e + f + g
[8] pry(main)* end
キーワード引数にするには、仮引数のあとに:を入れるだけです。
で、実引数の方は、使ってやってみるとこうなります。
[9] pry(main)> hoge = {a: 1, b:2, c: 3, d: 4, e: 5, f: 6, g: 7}
=> {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :f=>6, :g=>7}
[10] pry(main)> func(hoge)
=> 28
ふぁ!?!?
hogeをハッシュのシンボル形式で渡してやると、めっちゃスッキリしませんか?仮引数側は7つのなのに、実引数側は変数1つ打ち込めばいってことです。
fucnにhogeだけ渡せばいいので、これは楽。
ちなみにハマったのはこれ。
[11] pry(main)> hoge = {'a' => 1, 'b'=>2, 'c' => 3, 'd'=> 4, 'e'=> 5, 'f'=> 6, 'g'=> 7}
=> {"a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5, "f"=>6, "g"=>7}
[12] pry(main)> func(hoge)
ArgumentError: wrong number of arguments (given 1, expected 0)
from (pry):1:in `func'
ハッシュで渡しても、シンボルの形ではないとダメらしいです。
ArgumentError: wrong number of arguments (given 1, expected 0)なにがダメだったのかかわからなかったorz
キーワード引数で渡したら、実引数側もキーワード形式でもしくはシンボルのハッシュでないと引数として認識してくれないってことですね。
ちなみに、キーワード引数の:のあとにデフォルト値を設定しない場合は、必須値になるそうです。
なので
こういのは、怒られる。
[13] pry(main)> hoge = {a: 1, b:2, c: 3, d: 4, e: 5, f: 6}
=> {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :f=>6}
[14] pry(main)> func hoge
ArgumentError: missing keyword: g
from (pry):1:in `func'
けど、こういうのはいける。
[15] pry(main)> def func(a:, b:, c:, d:, e:, f:, g:0)
[15] pry(main)* a + b + c + d + e + f + g
[15] pry(main)* end
=> :func
[16] pry(main)> func hoge
=> 21
これから引数多くなったら、使っていこうと!