【问题标题】:How can I call two methods simultaneously using `&` [duplicate]如何使用`&`同时调用两个方法[重复]
【发布时间】:2017-07-07 11:38:50
【问题描述】:

而不是使用 & 在块中调用一个方法,

objects_array.collect(&:errors)

我可以使用& 同时调用两个方法吗?我想要这样的东西:

objects_array.collect(&:errors.full_messages)

有可能吗?

【问题讨论】:

  • 请注意,您想要的方法调用不是同时进行的。
  • 几乎所有事情在 ruby​​ 中都是可能的,这取决于你想为之付出多大的努力。 (大多数时候不值得努力)
  • 感谢所有评论的人。我已经知道它可以使用 map/collect 来完成。我只是想知道这是否可能。谢谢。

标签: ruby


【解决方案1】:

单次传球和速记无法做到这一点。要么做两遍

objects_array.collect(&:errors).collect(&:full_messages)

或使用完整的表格。

objects_array.collect{ |obj| obj.errors.full_messages }

【讨论】:

  • 虽然它会工作但不必要的中间数组和2个循环.. :)
  • @Md.FarhanMemon: 是的,我就是这么说的 :)
【解决方案2】:

可以吗?

不,它只是一种速记方法,用块代替..

objects_array.collect { |obl| obj.errors.full_messages }

【讨论】:

    【解决方案3】:

    如果您重新定义Symbol#method_missing 来存储方法链,也可以重新定义Symbol#to_proc 以使用存储的方法链扩展成一个proc。但我很确定它会引入复杂性而不是帮助,并导致一些严重的问题。不值得这样做。

    【讨论】:

    • 它只适用于未定义的方法,即[1, 10, 100].map(&:to_s.length) 会引发TypeError 而不是返回[1, 2, 3],因为Symbol 响应length
    • @Stefan 是的,undef_method 的更复杂组合和对method_missing“原始方法”的调用的编组应该在此处进行。
    • @Stefan OTOH Symbol#to_proc 可能会返回一个扩展的Proc 后代,它返回一个用TypeError 救援者包装的过程,这反过来又会将调用委托给它们所属的地方。 del> 那行不通。
    • @mudasobwa 为什么不添加 String#to_proc 之类的 def to_proc; self.split('.').inject(->(obj) {obj}) {|memo,meth| Proc.new {|*args| memo.call(args.shift).__send__(meth,*args)}}; end。然后我们可以调用objects_array.collect(&"errors.full_messages")
    • @mudasobwa 这个怎么样而不是Symbol#proc_chain e.g. def proc_chain(args); args.inject(self.to_proc) { |chain,meth| meth,*passable_args = [meth].flatten; Proc.new {|obj| chain.call(obj).__send__(meth,*passable_args)}};end 被称为 [1,2,3,4,5].map(&:itself.proc_chain([:to_s,2],[:to_i,10])) #=> [1, 10, 11, 100, 101]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2017-01-17
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多