【问题标题】:The ampersand operator with parameters [duplicate]带参数的 & 运算符 [重复]
【发布时间】:2013-07-24 10:19:57
【问题描述】:

我想知道,是不是可以使用带参数的&操作符来调用方法?

items.each &:my_proc # ok
items.each &:my_proc(123, "456") # ops!

【问题讨论】:

    标签: ruby


    【解决方案1】:

    不,这是不可能的。使用完整的形式。

    items.each{|i| i.my_proc(123, '456')}
    

    查看Symbol#to_proc 的来源以了解“为什么”。

    【讨论】:

    • 看了,但没有找到原因。你介意解释一下吗?
    • @MariusKavansky:因为它没有实现:)
    【解决方案2】:

    您可以使用一些技巧并获得类似的效果:

    class Symbol
      def [](*args)
        proc{|obj| obj.send(self, *args) }
      end
    end
    
    [123.456, 234.567].map(&:round[2])
    #=> [123.46, 234.57]
    

    我强烈反对在生产代码中使用,因为 gem 等可能依赖于 Symbol#[]。这只是一件有趣的事情;-)

    【讨论】:

    • 不错。例如,您可以使用bind_args 代替[]。虽然使用起来不那么漂亮,但在生产代码中会更安全。
    • 确实如此。但话说回来,我更喜欢标准而不是魔法,@SergioTulentsev 建议的形式更适合。
    • 其实map{|x| x.round(2)}map(&:round.bind_args(2)) 更短更好读:)
    猜你喜欢
    • 2015-08-22
    • 1970-01-01
    • 2017-01-04
    • 2020-02-07
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2021-11-26
    相关资源
    最近更新 更多