多重代入と暗黙の型変換

以前 Ruby には型変換メソッドが沢山用意されているが、あまり暗黙の型変換はしてくれないと書いた。

ところが多重代入をすると Array への型変換をやってくれるらしい。

class Foo
  def to_a; [:to_a] end
  def to_ary; [:to, :ary] end
end

foo = Foo.new

# 左辺が複数で右辺がひとつなら to_ary が呼ばれる
x, y = foo          # => #<Foo:0x100b3780>
x                   # => :to
y                   # => :ary

# 明示的に * で展開すると to_a が呼ばれる
x, y = *foo         # => [:to_a]
x                   # => :to_a
y                   # => nil

# 右辺も複数あると型変換されない
x, y, z = 0, foo    # => [0, #<Foo:0x100b8780>]
x                   # => 0
y                   # => #<Foo:0x100b8780>
z                   # => nil

# サブ代入を使うと型変換される
x, (y, z) = 0, foo  # => [0, #<Foo:0x100b8780>]
x                   # => 0
y                   # => :to
z                   # => :ary

多重代入はカオスだわ。