【发布时间】:2016-05-07 00:15:55
【问题描述】:
当我在将数组传递给方法时使用* 分解数组,然后在方法中使用* 重构数组时,不会保留数组的标识:
a = []
a.object_id # => 69846339548760
def bar *a; a.object_id end
bar(*a) # => 69846339537540
但是,当我将 proc 传递给方法时使用 & 将其转换为块,然后在方法中使用 & 从块中重建 proc,proc 的身份似乎被保留:
pr = ->{}
pr.object_id # => 69846339666160
def foo ≺ pr.object_id end
foo(&pr) # => 69846339666160
proc 对象是如何保存的?转换成块的时候不会丢失吗?这是有保证的行为吗?
【问题讨论】:
-
更多:
def baz ; puts Proc.new.object_id end ; p = ->{} ; p.object_id #⇒ 9708320 ; baz &p ; #⇒ 9708320 -
@mudasobwa 这是由于特殊的语法约定。当您在方法中创建没有块的 proc 时,它指的是传递给方法的 proc。
-
我知道了,谢谢。我的意思是
Proc.new实际上不是构造函数。 -
@mudasobwa 现在我明白你的意思了。
-
Proc实例不是不可变的吗?为什么当它作为参数传递给方法时要创建一个新实例?