【问题标题】:What does this ampersand mean? [duplicate]这个&符号是什么意思? [复制]
【发布时间】:2012-11-03 04:48:05
【问题描述】:

可能重复:
What does map(&:name) mean in Ruby?
What do you call the &: operator in Ruby?

只是看一些 railscast 并看到这样的代码:

[Category, Product, Person].each(&:delete_all)

我知道它会擦除这些模型的所有记录,但我不知道这个 &:delete_all 是什么意思。

【问题讨论】:

标签: ruby


【解决方案1】:

它基本上是这个的简写:

[Category, Product, Person].each { |e| e.delete_all }

也就是说,它向迭代器的每个元素发送delete_all

【讨论】:

    【解决方案2】:

    &:delete_all 基本上翻译成 |obj| obj.delete_all。 & 号在循环上的当前对象上调用 to_proc。

    【讨论】:

      【解决方案3】:

      当您将Proc 对象pr& 放在最后一个参数位置时,例如:

      some_method(&pr)
      

      然后,对应于pr 的块将被传递给some_method。如果对象non_pr 不是Proc,则给出如下:

      some_method(&non_pr)
      

      然后,non_pr 将被to_proc 隐式转换为Proc

      例如,当non_prSymbol 时,将应用Symbol#to_proc,恰好是这样的:

      class Symbol
        def to_proc
          proc{|obj, *args| obj.send(self, *args)}
        end
      end
      

      尤其是 each(&:delete_all):delete_all.to_proc 将返回 Proc 对象:

      proc{|obj, *args| obj.delete_all(*args)}
      

      所以相应的块将像这样传递给each

      each{|obj, *args| obj.delete_all(*args)}
      

      注意到Enumerable#each 的块的元数为一,简化为:

      each{|obj| obj.delete_all}
      

      【讨论】:

        猜你喜欢
        • 2016-10-10
        • 2014-08-13
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多