2016-11-23 1 views
0

Comment passer les résultats d'une méthode à une autre méthode dans ruby? par exemple:Comment chaîner des méthodes dans ruby ​​en passant la sortie d'une méthode à des méthodes consécutives

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

    def a s 
    "hello #{s}"  
    end 

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

Alors, ce que je veux faire est de passer la sortie de la méthode de la méthode b. Donc, essentiellement (si les méthodes ne sont pas dans une classe), je peux faire ce qui suit ce qui suit:

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

Cependant, même si ce n'est pas dans une classe, il ne serait pas l'air bien s'il y a beaucoup de méthodes donc il doit y avoir un moyen plus élégant de le faire. Alors, quelle est la bonne façon d'obtenir la sortie hi hello Tom en appliquant les méthodes a et b à une instance de la classe D?

MISE À JOUR Je voulais juste le rendre un peu plus clair. Par exemple, en F # vous pouvez faire quelque chose comme ceci:

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

nous avons défini ici les fonctions a et b, puis transmis les résultats à la fonction suivante. Je sais que c'est un langage fonctionnel, donc les façons de faire seraient différentes là-bas. Mais je me demande juste s'il y a de tels tours dans Ruby?

+1

"Donc il doit y avoir une façon plus élégante de faire ça" -Pourquoi est-ce? On pourrait utiliser 'puts b a 'Tom'', mais je doute que ce soit" plus élégant. " – mudasobwa

+0

@mudasobwa je comprends. Je viens de mettre à jour la question pour la rendre un peu plus claire. Peut-être que cela aiderait? :) –

+1

La question demeure: pourquoi sur la Terre, vous pensez que le chemin de F # est plus élégant? – mudasobwa

Répondre

5

Vous pouvez quitter le ()

def a s 
    "hello #{s}" 
end 

def b s 
    "hi #{s}" 
end 

puts b a "Tom" 

Si vous avez plusieurs méthodes:

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

Si vous souhaitez utiliser ces méthodes avec un objet (y compris les classes):

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, mise à jour pour 'puts [: a,: b] .inject (" Tom ") {| result, méthode | Object.send (méthode, résultat)} ':)' puts' pourrait aussi être chaîné, btw. – mudasobwa

+0

Wow, c'est génial! merci Eric. Maintenant, comment puis-je obtenir le même résultat si les méthodes sont à l'intérieur d'une classe, dans mon exemple disons classe D, alors comment puis-je obtenir le résultat en appliquant des méthodes à une instance de classe D? Ou devrais-je plutôt utiliser des méthodes de classe pour cela? –

+2

@BA vous pouvez définir instance par 'd = D.new (" test ")' et appeler 'd.send' au lieu de' Object.send' –