如果我有这个:
pr = Proc.new { puts 'test' }
有什么区别:
def test(arg)
arg.call
end
test(pr)
和
def test(&arg)
arg.call
end
test(&pr)
两者都返回相同的东西,所以我什么时候才能使用其中一个?
答案 0 :(得分:2)
&
通过to_proc
方法将块更改为proc,将对象更改为块。
两者之间的区别在于,在第一个中,你直接传递一个proc参数。在第二个中,您将proc作为块传递给方法,该方法在接收时转换回proc。在第一个中,proc仍然是同一个对象,但在第二个中,原始proc和接收的proc是不同的对象。
在这种情况下,当你有一个在变量/常量中传递的proc时,最好使用第一个,因为将proc转换为块并返回到proc,就像在第二个中一样,是冗余计算。如果要直接传递块,则应使用第二个选项。
答案 1 :(得分:1)
test(arg)
接受一个参数,您通过Proc
将test
对象传递给方法test(pr)
方法。
test(&arg)
接受零参数但接受一个块,您将&pr
的块传递给方法test
{{} 1}}。
test(&pr)
会将Proc &pr
转换为块。
<强> Further Reading. 强>