无法理解以splatted方式分配Ruby实例变量

时间:2013-02-19 04:34:38

标签: ruby

我尝试了下面的代码,看看我是否可以在没有任何显式实例方法调用的情况下直接在类外部分配实例变量。是的,下面的代码说我可以。

  @ubuntu:~$ irb --simple-prompt
  class Foo
  def initialize(x,y,z)
  @x, @y, @z= x, y,z
  end
  def to_ary
  [@x, @y, @z]
  end
  def to_hash
  [@x => @y]
  end
  end
  #=> nil
  foo = Foo.new(10,11,12)
  #=> #<Foo:0x00000001191738 @x=10, @y=11, @z=12>

我的问题如下:

 a,*b = foo
 #=> #<Foo:0x00000001191738 @x=10, @y=11, @z=12>
 a
 #=> 10
 b
 #=> [11, 12]

在没有创建对象的情况下,如何调用内部方法从实例变量中对a,*b进行此类赋值?

由于

1 个答案:

答案 0 :(得分:1)

Ruby解释器需要将多个赋值的右侧作为数组,因此它通过正常的过程来获取数组。该过程的一部分是在目标对象上调用to_ary。您的to_ary会返回[@x,@y, @z],并且由于splat的行为,会产生a = @xb = [@y, @z]