我遇到了一个代码片段,其中包含以下内容
a.each_slice(2).map(&:reverse)
我不知道&:
运营商的功能。这是如何运作的?
答案 0 :(得分:75)
Ruby中没有&:
运算符。您看到的是应用于&
的{{1}}运算符。
在方法参数列表中,:symbol
运算符获取其操作数,如果尚未将其转换为&
对象(通过调用Proc
)并传递它该方法就像使用了一个块一样。
to_proc
现在问题变成“my_proc = Proc.new { puts "foo" }
my_method_call(&my_proc) # is identical to:
my_method_call { puts "foo" }
做了什么?”,这在the Rails documentation中很容易看到:
将符号转换为简单的proc,这对枚举特别有用。例子:
Symbol#to_proc
答案 1 :(得分:22)
通过将&
添加到符号中,您将创建一个lambda函数,该函数将在您传递给此函数的对象上调用带有该符号名称的方法。考虑到这一点:
ar.map(&:reverse)
大致相当于:
ar.map { |element| element.reverse }