【问题标题】:How to chain methods in ruby passing the output of one method to consecutive methods如何在ruby中链接方法,将一种方法的输出传递给连续的方法
【发布时间】:2016-11-23 13:07:36
【问题描述】:

如何将一个方法的结果传递给 ruby​​ 中的另一个方法? 例如:

class D
  def initialize(text)
    @text = text
  end

  def a s
    "hello #{s}"    
  end

  def b s
    "hi #{s}"
  end
end

所以,我想做的是将方法a的输出传递给方法b。所以本质上(如果方法不在类中)我可以执行以下操作:

puts b(a "Tom") #=>hi hello Tom

然而,即使这不在一个类中,如果有很多方法,它也不会好看,所以必须有一个更优雅的方法来做到这一点。那么通过将方法 a 和 b 应用于 D 类的实例来获得输出 hi hello Tom 的正确方法是什么?

更新 我只是想让它更清楚一点。例如,在 F# 中,您可以执行以下操作:

let a s = "hello " + s
let b s = "hi " + s
"Tom" |> a |> b #=> hello hi Tom

这里我们定义了函数 a 和 b,然后将结果传递给下一个函数。 我知道它是一种函数式语言,所以那里的做事方式会有所不同。但是我只是想知道Ruby中是否有任何此类技巧?

【问题讨论】:

  • “所以必须有一种更优雅的方式来做到这一点”——这是为什么呢?有人可能会使用puts b a 'Tom',但我怀疑它“更优雅”。
  • @mudasobwa 我明白了。我刚刚更新了这个问题,让它更清楚一点。也许会有所帮助? :)
  • 问题仍然存在:为什么你认为 F# 的方式更优雅

标签: ruby methods chain


【解决方案1】:

您可以留下()

def a s
  "hello #{s}"
end

def b s
  "hi #{s}"
end

puts b a "Tom"

如果你有很多方法:

puts [:a,:b].inject("Tom"){|result,method| self.send(method,result)}

如果您想将这些方法用于任何对象(包括类):

module Kernel
  def chain_methods(start_value, *methods)
    methods.inject(start_value){|result,method| self.send(method,result)}
  end
end

class D
  def a s
    "hello #{s}"
  end

  def b s
    "hi #{s}"
  end
end

class E
  class << self
    def a s
      "hello #{s}"
    end

    def b s
      "hi #{s}"
    end
  end
end


# Example with instance methods
puts D.new.chain_methods("Tom", :a, :b)

# Example with class methods
puts E.chain_methods("Tom", :a, :b)

# Thanks mudasobwa :
E.chain_methods("Tom", :a, :b, :puts)

【讨论】:

  • 是的,支持puts [:a,:b].inject("Tom"){|result,method| Object.send(method,result)} :) puts 也可以被链接,顺便说一句。
  • 哇,太棒了!谢谢埃里克。现在,如果方法在一个类中,我怎样才能得到相同的结果,在我的例子中可以说是类 D,那么我怎样才能通过将方法应用于类 D 的实例来获得结果呢?或者我应该为此使用类方法吗?
  • @BA 您可以通过d = D.new("test") 定义实例并调用d.send 而不是Object.send
  • @EricDuminil 谢谢,虽然比你的其他方法有点复杂。 :)
  • 为什么把方法发给Object?在原始代码中,它们被发送到self,因此您调用的是完全不同的方法。虽然,请改用public_send,但这里没有理由破坏封装。
猜你喜欢
  • 1970-01-01
  • 2014-01-05
  • 2011-06-08
  • 1970-01-01
  • 2017-07-29
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多