2016-11-23 52 views
0

如何将方法的结果传递给ruby中的另一个方法? 如:如何链接ruby中的方法将一个方法的输出传递给连续的方法

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

    def a s 
    "hello #{s}"  
    end 

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

所以,我想要做的是方法的输出传递方法b。所以基本上(如果该方法不是一个类中),我可以做以下的以下内容:

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

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

UPDATE 我只是想让它更清楚一点。例如,在F#中,你可以这样做:

​​

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

+1

“所以必须有更优雅的方式来做到这一点” - 为什么?有人可能会使用'puts b a'Tom'',但我怀疑它是“更优雅”。 – mudasobwa

+0

@mudasobwa我明白。我刚刚更新了这个问题,使其更加清晰。也许这会有所帮助? :) –

+1

问题依然存在:为什么在地球上你认为F#的方式更优雅? – mudasobwa

回答

5

你可以离开()

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) 
+2

Yay,upvoted for'puts [:a,:b] .inject(“Tom”){| result,method | Object.send(method,result)}'''puts'也可以链接,顺便说一句。 – mudasobwa

+0

哇,太棒了!感谢Eric。现在,如果方法在类内部,我怎么才能得到相同的结果,在我的例子中可以说类D,那么如何通过将方法应用到类D的实例来获得结果呢?或者我应该使用类方法呢? –

+2

@BA你可以通过'd = D.new(“test”)定义实例'并且调用'd.send'而不是'Object.send' –