ฅ(・ω・ฅ){ 読み捨て御免！引数があってもなくても読み捨てる無名可変長引数のメソッド } #ruby

## <i class="fa fa-trash-o" style="font-size:1em;"></i> 概要
読み捨て御免！  引数があってもなくても読み捨てる無名可変長引数のメソッド

## :baby_chick::baby_chick::baby_chick: 可変長引数( variadic )
まずは、普通の可変長引数

### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~ruby
class Hoge
  def hoge(*variadic)
    variadic.size
  end
end

args = [[], [1], [1]*2, [1]*3]
h = Hoge.new
puts h.hoge
args.each { |e|puts h.hoge(*e) }
puts h.method(:hoge).arity
~~~

### :horse: 出力

~~~
0
0
1
2
3
-1
~~~

## :bust_in_silhouette::bust_in_silhouette::bust_in_silhouette: 無名可変長引数( anonymous variadic )
変数名なしの可変長引数を利用すると、どんな引数が来ても読み捨てる。
※無名可変長引数( anonymous variadic ) という名前は仮称。

### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~ruby
class Hoge
  def hoge(*)
    "anonymous"
  end
end

args = [[], [1], [1]*2, [1]*3]
h = Hoge.new
puts h.hoge
args.each { |e|puts h.hoge(*e) }
puts h.method(:hoge).arity
~~~

### :horse: 出力

~~~
anonymous
anonymous
anonymous
anonymous
anonymous
-1
~~~

## :squirrel: pry で内部構造を確認してみる
変数の情報は <i class="fa fa-external-link" style="font-size:1em;"></i> [`Method#parameters`](http://docs.ruby-lang.org/ja/2.1.0/method/Method/i/parameters.html) で参照できる

|key|memo|
|:--|:--|
|:req|必須の引数|
|:opt|デフォルト値が指定されたオプショナルな引数|
|:rest|* で指定された残りすべての引数|
|:block|& で指定されたブロック|

### :man: 名前付き可変長引数の場合
必須の引数 `:req` に `a` と `b` が
可変長引数 `:rest` に `c` が
それぞれ設定されていることを確認できる。

~~~
% pry
[1] pry(main)> class Hoge
[1] pry(main)*   def hoge(a, b, *c)
[1] pry(main)*   end
[1] pry(main)* end
=> :hoge
[2] pry(main)> cd Hoge.new
[3] pry(#<Hoge>):1> cd self.method(:hoge)
[4] pry(#<Method>):2> parameters
=> [[:req, :a], [:req, :b], [:rest, :c]]
~~~

### :bust_in_silhouette: 無名可変長引数の場合
可変長引数 `:rest` が設定されているが、
引数名が割り当てられていないことを確認できる。

~~~
% pry
[1] pry(main)> class Hoge
[1] pry(main)*   def hoge(*)
[1] pry(main)*   end
[1] pry(main)* end  d
=> :hoge
[2] pry(main)> cd Hoge.new
[3] pry(#<Hoge>):1> cd self.method(:hoge)
[4] pry(#<Method>):2> parameters
=> [[:rest]]
~~~

## :rage1: 出番はあるのだろうか？
例えばこんなことができる。
引数をとらないメソッドと可変長引数のメソッドでダックタイピングしたい時。
引数をとらないメソッド側を無名可変長引数にすることでダックタイピングが可能になる。

サンプルがあるか調べたかったのだが、そもそも `some_method(*)` の `(*)` が
ものすごくググラビリティが低く、見つけることができませんでした。
どなたか、その他も含めて有用な利用法および OSS などでの実用例を知っている方がおられましたら、
コメントいただけると嬉しいです。

### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル

~~~ruby
class HaveArgs
  def sample(*rest)
    "sample #{self.class}"
  end
end

class NoArgs
  def sample(*)
    "sample #{self.class}"
  end
end

# 引数ありで呼んでも両方エラーにならない
[HaveArgs.new, NoArgs.new].each do |e|
  puts e.sample('one', 'two', 'three')
end

# 引数なしで呼んでも両方エラーにならない
[HaveArgs.new, NoArgs.new].each do |e|
  puts e.sample
end

class NoArgs
  def sample
    "sample #{self.class}"
  end
end

# 仮に単なる引数なしメソッドだとエラーになる
begin
  [HaveArgs.new, NoArgs.new].each do |e|
    puts e.sample('one', 'two', 'three')
  end
rescue => e
  puts e.message
  puts e.backtrace
end
~~~

### :house: 出力

~~~
sample HaveArgs
sample NoArgs
sample HaveArgs
sample NoArgs
sample HaveArgs
wrong number of arguments (3 for 0)
anonymous_variadic_sample.rb:24:in `sample'
anonymous_variadic_sample.rb:32:in `block in <main>'
anonymous_variadic_sample.rb:31:in `each'
anonymous_variadic_sample.rb:31:in `<main>'
~~~