1

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

  @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实例变量进行此类分配?

谢谢

4

1 回答 1

1

Ruby 解释器需要多重赋值的右边是一个数组,所以它通过正常的过程来获取一个数组。该过程的一部分是调用to_ary目标对象。您的to_aryreturn [@x,@y, @z],并且由于 splat 的行为,导致a = @xand b = [@y, @z]

于 2013-02-19T05:05:35.847 回答