Ruby &ers冒号快捷方式

All*_*ant 316 ruby

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

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

some_objects.each(&:foo)
Run Code Online (Sandbox Code Playgroud)

它是一样的

some_objects.each { |obj| obj.foo }
Run Code Online (Sandbox Code Playgroud)

也就是说,&:foo创建块{ |obj| obj.foo },将其转换为Proc,并将其传递给每个块.为什么这样做?它只是一个Ruby特例,还是有理由为什么这样做呢?

Aug*_*aas 471

你的问题是错的,可以这么说.这里发生的不是"&符号和冒号",它是"&符号和对象".在这种情况下,冒号是符号.所以,有&,有:foo.

对对象的&调用to_proc,并将其作为块传递给方法.在Rails to_proc中实现Symbol,以便这两个调用是等效的:

something {|i| i.foo }
something(&:foo)
Run Code Online (Sandbox Code Playgroud)

另外,to_procon Symbol在Ruby 1.8.7和1.9中实现,所以它实际上是一个"红宝石".

这样,总结一下:&调用to_proc该对象上,并将其作为一个块的方法,和Ruby实现to_procSymbol.

  • 更准确地说:&符号解压缩`Proc`对象,使其像传统文件块一样被传递.只有当对象不是*已经是'Proc`对象时,它才会调用`to_proc`. (83认同)
  • @Steve:不,它也是1.8.7.p RUBY_VERSION#=>"1.8.7"p ["a","b","c"].map(&:upcase)#=> ["A","B","C"] (7认同)
  • 谢谢。尽管多年来一直使用该约定,但这是我第一次*实际上*了解&:在做什么。 (2认同)

Mic*_*are 84

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

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

=> ["stat", "nat", "informat"]
Run Code Online (Sandbox Code Playgroud)

或整数.

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

arr = [[*3..7],[*14..27],[*?a..?z]]
arr.map &4
=> [7, 18, "e"]
Run Code Online (Sandbox Code Playgroud)

arr.map(&:fifth)你有arr.map &4什么需要的?

  • 喜欢这个例子比答案标记正确 (4认同)