ruby语法 - ruby中“&:”运算符的功能是什么?



ruby数组赋值 (2)

可能重复:
map(&:name)在Ruby中意味着什么?

我遇到了一个代码片段,其中包含以下内容

a.each_slice(2).map(&:reverse)

我不知道&:运算符的功能。 这是如何运作的?

https://src-bin.com


Answer #1

Ruby中没有&:运算符。 您所看到的是&运算符应用于:symbol

在方法参数列表中, &运算符获取其操作数,如果它尚未(通过调用to_proc )将其转换为Proc对象,并将其传递给方法,就像使用了块一样。

my_proc = Proc.new { puts "foo" }

my_method_call(&my_proc) # is identical to:
my_method_call { puts "foo" }

所以问题现在变成了“ Symbol#to_proc做什么?”,这在Rails文档中很容易看到:

将符号转换为简单的proc,这对于枚举尤其有用。 例子:

# The same as people.collect { |p| p.name }
people.collect(&:name)

# The same as people.select { |p| p.manager? }.collect { |p| p.salary }
people.select(&:manager?).collect(&:salary)

Answer #2

通过在符号前面加上你正在创建一个lambda函数,该函数将在传递给该函数的对象上调用带有该符号名称的方法。 考虑到这一点:

ar.map(&:reverse)

大致相当于:

ar.map { |element| element.reverse }




ruby