Je voudrais expliquer la portée des variables avec un code assez simple.
On suppose que le contrôleur suivant est décrit.
class SampleController < ApplicationController
def test1
sample_1 = 10
test3(sample_1)
end
def test2
sample_2 = 10
test4
end
private
def test3(num)
sample_3 = num + 10
end
def test4
sample_4 = sample_2 + 10
end
end
Apparemment, l'action test1 appellera l'action test3 (num) de la méthode privée, et l'action test2 appellera l'action test4 de la méthode privée.
Si vous écrivez d'abord à partir de la conclusion, l'appel et le traitement de test3 (num) à partir de test1 fonctionnent bien, mais vous pouvez appeler test4 à partir de test2, mais le traitement ne fonctionne pas et une erreur se produit.
Dans test1, «sample_1 = 10» est défini en interne et il est passé à test3 (num) comme argument réel dans la notation «test3 (sample_1)».
def test1
sample_1 = 10
test3(sample_1)
end
Dans test3, l'échantillon_1 passé est affecté à l'argument formel num. En d'autres termes, si vous l'écrivez d'une manière facile à comprendre (?), Cela signifie «num = 10».
def test3(num)
sample_3 = num + 10
end
De cette façon, le nombre a été passé avec succès à num, donc le calcul du contenu de test3 (num) est en fait sample_3 = 10 + 10
Ensuite, sample_3 = 20
.
Dans test2, test4 est appelé après avoir défini sample_2 = 10
en interne.
def test2
sample_2 = 10
test4
end
À l'intérieur de test4, sample_2 = 10
défini dans test2 peut être utilisé, le calcul du contenu est donc pratique.
Puisque sample_4 = 10 + 10
, ce n'est pas sample_4 = 20
.
Pourquoi?
def test4
sample_4 = sample_2 + 10
end
En effet, sample_2 ne peut pas être utilisé dans test4.
Peu importe combien vous définissez sample_2 = 10
dans test2, cela n'a rien à voir avec test4.
C'est ce qu'on appelle la portée des variables. Si vous écrivez d'abord à partir de la conclusion, les variables qui peuvent être utilisées dans test4
C'est. (Pour être précis, je pense que j'aurais pu utiliser une variable globale, mais c'est compliqué, je vais donc l'omettre.)
Hmm? Variable d'instance? C'est celui avec @.
Donc, si vous voulez utiliser sample_2 = 10
dans test4
def test2
@sample_2 = 10
test4
end
Définissez-le comme ça, même dans test4
def test4
sample_4 = @sample_2 + 10
end
Vous pouvez l'utiliser en ajoutant @ et en l'appelant comme ceci, et ce sera en toute sécurité sample_4 = 20
.
Recommended Posts