传递proc对象时测试(& p)和测试(p)之间的区别?

时间:2014-09-10 02:25:23

标签: ruby

如果我有这个:

pr = Proc.new { puts 'test' }

有什么区别:

def test(arg)
  arg.call
end

test(pr)

def test(&arg)
  arg.call
end

test(&pr)

两者都返回相同的东西,所以我什么时候才能使用其中一个?

2 个答案:

答案 0 :(得分:2)

&通过to_proc方法将块更改为proc,将对象更改为块。

两者之间的区别在于,在第一个中,你直接传递一个proc参数。在第二个中,您将proc作为块传递给方法,该方法在接收时转换回proc。在第一个中,proc仍然是同一个对象,但在第二个中,原始proc和接收的proc是不同的对象。

在这种情况下,当你有一个在变量/常量中传递的proc时,最好使用第一个,因为将proc转换为块并返回到proc,就像在第二个中一样,是冗余计算。如果要直接传递块,则应使用第二个选项。

答案 1 :(得分:1)

test(arg)接受一个参数,您通过Proctest对象传递给方法test(pr)方法。

test(&arg)接受零参数但接受一个块,您将&pr的块传递给方法test {{} 1}}。

传递给方法时,

test(&pr)会将Proc &pr转换为块。

<强> Further Reading.