ruby 中“&:”运算符的功能是啥? [复制]

Posted

技术标签:

【中文标题】ruby 中“&:”运算符的功能是啥? [复制]【英文标题】:what is the functionality of "&: " operator in ruby? [duplicate]ruby 中“&:”运算符的功能是什么? [复制] 【发布时间】:2012-03-14 20:21:25 【问题描述】:

可能重复:What does map(&:name) mean in Ruby?

我遇到了一个代码 sn-p,它有以下内容

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

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

【问题讨论】:

这是 *** 上已经提出和回答的不少于 17 个其他问题的副本:Understanding [ClassOne, ClassTwo].each(&:my_method)、What does map(&:name) mean in Ruby?、What exactly is &:capitalize in Ruby?、Ruby/Ruby on Rails ampersand colon shortcut、Ruby : &:symbol syntax、 … …What is this &:last Ruby Construct Called?,What do you call the &: operator in Ruby?,What does map(&:name) do in this Ruby code?,What are :+ and &+ in ruby?,&:views_count in Post.published.collect(&:views_count),Ruby Proc Syntax,How does “(1..4).inject(&:+)” work in Ruby,… …What does following statement &:property ?、What does the & mean in the following ruby syntax?、Why would one use the unary operator on a property in ruby? i.e &:first、how does Array#map have parameter to do something like this? 和 what does &: mean in ruby, is it a block mixed with a symbol?。 【参考方案1】:

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

在方法参数列表中,& 运算符获取其操作数,如果还没有将其转换为 Proc 对象(通过在其上调用 to_proc)并将其传递给方法,就好像块已被使用。

my_proc = Proc.new  puts "foo" 

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

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

将符号转换为简单的过程,这对于枚举特别有用。例子:

# 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)

【讨论】:

你是在暗示它,但最好明确地告诉它:这是 Rails 所做的修改,它不是 Ruby 本身内置的。 @kikito: ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc 你是对的 - 我刚刚在普通的 irb (1.8.7) 中尝试过,它在 Ruby 本身中。这不是 Rails 提供的。感谢您纠正我的错误! @kikito:实际上它最初是在 Rails 中实现的,但每个人都喜欢它,所以它进入了核心。 请不要回答重复的问题。只需投票关闭。这个问题已经被问和回答了 17(!!!) 次了,进一步传播知识确实没有任何收获【参考方案2】:

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

ar.map(&:reverse)

大致相当于:

ar.map  |element| element.reverse 

【讨论】:

以上是关于ruby 中“&:”运算符的功能是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中的“=~”运算符是啥?

在 Ruby 中,“=>”是啥意思,它是如何工作的? [复制]

Ruby中And/&&的运算符优先级[重复]

Ruby 中的“temps.each(&:valid?)”是啥意思? [复制]

在ruby && =运算符是片状?

c++程序中->second 是啥意思