2016-10-25 1 views
0

Vu le code suivant:Dans Ruby, comment les variables sont-elles passées dans les arguments sans appel de méthode?

def method 
    words = "33" 
    return words 
end 

def callmethod 
    words = method 
    result = printout(words) 
end 

def printout(words) 
    puts (words) 
end 

callmethod #will print out --> "33" (words from method) 

Comment Ruby reconnaît que la words variable fait partie de l'appel de méthode (callmethod) quand il n'a pas été appelé explicitement? Dans ce cas, la ligne dont je parle spécifiquement résultat = printout(words). Il semble que cette fonction ramasse les mots variables (valeur de retour de la méthode), même si je n'ai pas utilisé l'appel de méthode pour le mettre explicitement. Quelqu'un peut-il m'expliquer comment cela est possible?

+1

'words = method' est la même chose que' words = method() '. Vous appelez la méthode nommée 'method', donc' words' va maintenant contenir la valeur '33'. – Casper

+1

Que pensiez-vous que la ligne 'words = method' faisait, sinon invoquer' method' et stocker la valeur retournée dans une nouvelle variable locale appelée 'words'? – meagar

+0

Je reçois le fait qu'il a renvoyé une valeur et stocké dans des mots. N'a pas vraiment le fait que la façon dont la fonction a attrapé les mots variables locales sans avoir à passer par une méthode. – developer098

Répondre

3

Dans callmethod la méthode words est une variable locale avec la valeur de la valeur de retour de la méthode method.

printout(words) fonctionne comme prévu, car vous lui transmettez une valeur de la variable locale words, qui est la chaîne "33".

En Ruby method_name() sont facultatifs lors de l'appel d'une méthode. S'il vous arrive d'avoir une variable locale avec le même nom, comme méthode, pour que Ruby sache que vous voulez appeler une méthode, pas pour obtenir une valeur de variable locale, vous pouvez dire method_name(). Mais il existe une option meilleure/recommandée - self.method_name.

+1

Bien que vous puissiez * ajouter * des accolades, en pratique vous ne le faites presque jamais: 'self.x' est ce que la plupart des guides de style recommandent par rapport à' x() '. – tadman

+0

@tadman vraiment, très bon point à propos de 'self.x', va éditer –

+0

pouvez-vous donner un exemple peut-être en utilisant l'exemple précédent de la façon de le réécrire avec self.x? – developer098