[RAILS] Plage où les variables peuvent être utilisées avec ruby [Scope]

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.

Quelle est la différence

Pour test1 et test3

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.

Pour test2 et test4

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.

J'obtiens une erreur

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

Plage où les variables peuvent être utilisées avec ruby [Scope]
À propos de la plage et de la portée dans lesquelles les variables Day16 peuvent être utilisées
Portée de la variable Java (plage où les variables peuvent être vues)
Jusqu'à ce que le rubis puisse être utilisé dans les fenêtres ...
Créer un environnement où pip3 peut être utilisé avec CentOS7 + Python3
À propos des variables et de la portée (ruby)
Méthodes de tableau Ruby pouvant être utilisées avec Rails (autres que chacun)
Organiser les méthodes qui peuvent être utilisées avec StringUtils
Créer un contrôle de page qui peut être utilisé avec RecyclerView
Base de données Firebase-Realtime sur Android pouvant être utilisée avec copie
Apprendre Ruby avec la sélection des débutants AtCoder [Quelques sommes] Augmentez les méthodes qui peuvent être utilisées
[Ruby] Gérez les variables d'instance avec des méthodes d'instance
SwiftUI View qui peut être utilisé en combinaison avec d'autres frameworks
Implémentation de machine à sous simple qui peut être utilisée avec copie
[Rails] "Pry-rails" qui peuvent être utilisés lors de l'enregistrement avec la méthode create
Outils d'analyse des performances et de diagnostic des pannes utilisables avec OpenJDK
Paramètres initiaux jusqu'à ce que S2Dao puisse être utilisé
À propos du cas où ("b" .. "aa") ne pourrait pas être utilisé dans Ruby Range
Créez un environnement dans lequel CircleCI peut être exécuté localement avec Windows10 + WSL2 (Ubuntu) + Docker