Ruby&符号冒号快捷方式[重复]

Posted

技术标签:

【中文标题】Ruby&符号冒号快捷方式[重复]【英文标题】:Ruby ampersand colon shortcut [duplicate] 【发布时间】:2010-12-29 23:34:21 【问题描述】:

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

在 Ruby 中,我知道如果我这样做:

some_objects.each(&:foo)

和这个一样

some_objects.each  |obj| obj.foo 

也就是说,&:foo 创建块 |obj| obj.foo ,将其转换为 Proc,并将其传递给每个块。为什么这行得通?它只是 Ruby 的一个特例,还是有什么理由可以这样工作?

【问题讨论】:

这也称为pretzelcolon语法。 【参考方案1】:

可以这么说,你的问题是错误的。这里发生的不是“& 和冒号”,而是“& 和对象”。在这种情况下,冒号用于符号。所以,有&:foo

& 在对象上调用to_proc,并将其作为块传递给方法。在Ruby中,to_proc是在Symbol上实现的,所以这两个调用是等价的:

something |i| i.foo 
something(&:foo)

所以,总结一下:& 在对象上调用to_proc 并将其作为块传递给方法,Ruby 在Symbol 上实现to_proc

【讨论】:

更准确地说:与符号解包 Proc 对象,以便它像文字块一样被传递。只有当对象已经不是Proc对象时,它才会调用to_proc @Steve:不,它也在 1.8.7 中。 p RUBY_VERSION # => "1.8.7" p ["a", "b", "c"].map(&:upcase) # => ["A", "B", "C"] ruby-doc.org/core 适用于 1.8.7,ruby-doc.org/core-1.8.7 / 相当于 1.8.7。这是条目:ruby-doc.org/core-1.8.7/classes/Symbol.html#M000086 谢谢,这是有道理的。很高兴知道它在 Ruby 1.8.7 和 1.9 中。 谢谢。这是我第一次真正地​​了解 &: 在做什么,尽管多年来一直使用这个约定。【参考方案2】:

& 符号和符号的组合并没有什么特别之处。这是(ab)使用正则表达式的示例:

class Regexp
  def to_proc
    ->(str)  self =~ str ; $1 
  end
end
%w(station nation information).map &/(.*)ion/

=> ["stat", "nat", "informat"]

或整数。

class Integer
  def to_proc
    ->(arr)  arr[self] 
  end
end

arr = [[*3..7],[*14..27],[*?a..?z]]
arr.map &4
=> [7, 18, "e"]

你有arr.map &4,谁还需要arr.map(&:fifth)

【讨论】:

喜欢这个例子比回答正确 很高兴看到[*3..7] 语法。我没想到你会那样摔跤!

以上是关于Ruby&符号冒号快捷方式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QMenu 中为 QActions 指定助记符(& 符号快捷方式)?

如何避免重定向输出符号“>”被当作命令行参数(可能在快捷方式中)

在我的 Android 主屏幕上列出快捷方式 [重复]

代码符号 cmd 通过 Mavericks 10.9 上的原始文件更改应用程序的快捷方式

是否有检查嵌套属性存在的快捷方式[重复]

新手为Android创建URL应用程序的快捷方式[重复]