使一个对象表现得像一个数组,用于在ruby中进行并行赋值

all*_*ode 5 ruby variable-assignment

假设您在Ruby中执行此操作:

ar = [1, 2]
x, y = ar
Run Code Online (Sandbox Code Playgroud)

然后,x == 1和y == 2.我可以在自己的类中定义一个能产生相同效果的方法吗?例如

rb = AllYourCode.new
x, y = rb
Run Code Online (Sandbox Code Playgroud)

到目前为止,我所能完成的任务就是使x == rb和y = nil.Python有这样的功能:

>>> class Foo:
...     def __iter__(self):
...             return iter([1,2])
...
>>> x, y = Foo()
>>> x
1
>>> y
2
Run Code Online (Sandbox Code Playgroud)

ram*_*ion 7

是的.定义#to_ary.这将使您的对象被视为一个用于赋值的数组.

irb> o = Object.new
=> #<Object:0x3556ec>
irb> def o.to_ary
       [1, 2]
     end
=> nil
irb> x, y = o
=> [1,2]
irb> x
#=> 1
irb> y
#=> 2
Run Code Online (Sandbox Code Playgroud)

之间的区别#to_a和#to_ary是#to_a被用来尝试给定对象转换为数组,而#to_ary可如果我们可以把给定的对象数组.这是一个微妙的差异.