[RAILS] Bereich, in dem Variablen mit Ruby verwendet werden können [Scope]

Ich möchte den Umfang von Variablen mit ziemlich einfachem Code erklären.

Es wird angenommen, dass die folgende Steuerung beschrieben wird.

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

Anscheinend ruft die Aktion test1 die Aktion test3 (num) der privaten Methode auf, und die Aktion test2 ruft die Aktion test4 der privaten Methode auf.

Wenn ich zuerst aus der Schlussfolgerung schreibe, funktioniert der Aufruf und die Verarbeitung von test3 (num) von test1 gut, aber ich kann test4 von test2 aufrufen, aber die Verarbeitung funktioniert nicht und es tritt ein Fehler auf.

Was ist der Unterschied

Für Test1 und Test3

In Test1 wird "sample_1 = 10" intern definiert und als tatsächliches Argument in der Notation "test3 (sample_1)" an test3 (num) übergeben.

  def test1
    sample_1 = 10
    test3(sample_1)
  end

In test3 wird das übergebene sample_1 dem formalen Argument num zugewiesen. Mit anderen Worten, wenn Sie es leicht verständlich schreiben (?), Bedeutet es "num = 10".

  def test3(num)
    sample_3 = num + 10
  end

Auf diese Weise wurde die Nummer erfolgreich an num übergeben, sodass die Berechnung des Inhalts von test3 (num) tatsächlich "sample_3 = 10 + 10" ist Dann ist "sample_3 = 20".

Für Test2 und Test4

In Test2 wird test4 aufgerufen, nachdem intern "sample_2 = 10" definiert wurde.

  def test2
    sample_2 = 10
    test4
  end

In test4 kann "sample_2 = 10" verwendet werden, das in test2 definiert ist, sodass die Berechnung des Inhalts praktisch ist. Da "sample_4 = 10 + 10" ist, ist es nicht "sample_4 = 20".

Ich bekomme eine Fehlermeldung

Warum?

  def test4
    sample_4 = sample_2 + 10
  end

Dies liegt daran, dass sample_2 nicht in test4 verwendet werden kann. Egal wie viel Sie in test2 sample_2 = 10 definieren, es hat nichts mit test4 zu tun.

Dies wird als Gültigkeitsbereich von Variablen bezeichnet. Wenn Sie zuerst aus der Schlussfolgerung schreiben, die Variablen, die in test4 verwendet werden können

Das ist. (Um genau zu sein, ich denke, ich hätte eine globale Variable verwenden können, aber es ist kompliziert, also werde ich es weglassen.)

Hmm? Instanzvariable? Das ist der mit @.

Wenn Sie also in sample4 sample_2 = 10 verwenden möchten

  def test2
    @sample_2 = 10
    test4
  end

Definieren Sie es auch in test4 so

  def test4
    sample_4 = @sample_2 + 10
  end

Sie können es verwenden, indem Sie @ hinzufügen und es so aufrufen, und es wird sicher sample_4 = 20 sein.

Recommended Posts

Bereich, in dem Variablen mit Ruby verwendet werden können [Scope]
Informationen zu Bereich und Umfang, in denen Day16-Variablen verwendet werden können
Java-Variablenbereich (Bereich, in dem Variablen angezeigt werden)
Bis Rubin in Fenstern verwendet werden kann ...
Erstellen Sie eine Umgebung, in der pip3 mit CentOS7 + Python3 verwendet werden kann
Über Variablen und Umfang (Ruby)
Ruby-Array-Methoden, die mit Rails verwendet werden können (außer jedem)
Organisieren Sie Methoden, die mit StringUtils verwendet werden können
Erstellen Sie ein Seitensteuerelement, das mit RecyclerView verwendet werden kann
Firebase-Realtime-Datenbank für Android, die mit Kopie verwendet werden kann
Lernen Sie Ruby mit AtCoder Anfänger Auswahl [Einige Summen] Erhöhen Sie die Methoden, die verwendet werden können
[Ruby] Behandeln Sie Instanzvariablen mit Instanzmethoden
SwiftUI-Ansicht, die in Kombination mit anderen Frameworks verwendet werden kann
Einfache Implementierung eines Spielautomaten, die mit Kopie verwendet werden kann
[Rails] "Pry-Rails", die beim Speichern mit der create-Methode verwendet werden können
Tools zur Leistungsanalyse und Fehlerdiagnose, die mit OpenJDK verwendet werden können
Grundeinstellungen bis S2Dao verwendet werden kann
Über den Fall, dass ("b" .. "aa") nicht in Ruby Range verwendet werden konnte
Erstellen Sie eine Umgebung, in der CircleCI lokal mit Windows 10 + WSL2 (Ubuntu) + Docker ausgeführt werden kann