[Ruby] Dies ist die Lösung. Wann sollte ich Instanzvariablen verwenden?

Leute, die lesen wollen

** Ich habe die Bedeutung von Instanzvariablen irgendwie verstanden, aber wie verwende ich lokale Variablen, Instanzvariablen und Klassenvariablen schließlich richtig? ** ** ** Für eine Person wie mich in der Vergangenheit. Ich denke, dass selbst Anfänger es schreiben können, damit sie es verstehen können, indem sie es lesen.

Fazit: Umfang

** Denken Sie nur an den Bereich der Variablen, die Sie verwenden möchten. ** ** ** ** Mit anderen Worten, betrachten Sie den Bereich (den Bereich, in dem Variablen und Methoden aufgerufen werden können) </ font>. ** ** ** Ich werde es unten erklären.

Arten von Variablen, die in Ruby verwendet werden können

  1. Lokale Variablen
  2. Instanzvariablen
  3. Klassenvariablen (4. Klasseninstanzvariable)
  4. Globale Variablen

Jeder hat einen anderen Umfang.

Lokale Variablen

Setzen Sie kein @ vor den Variablennamen. ** Kann nur innerhalb der definierten Methode oder Klasse aufgerufen werden. ** ** ** Wenn Sie versuchen, es außerhalb des Gültigkeitsbereichs aufzurufen, wird der Fehler "undefinierte lokale Variable oder Methode" für main: Object (NameError) "angezeigt.

Beispiel 1 Die Variable Morgen kann nur innerhalb der Methodemorgen_nachricht verwendet werden

local_variable.rb


def morning_message
  morning = "Morgen"
  puts "#{morning}ist" 
end

morning_message # =>Es ist Morgen

puts morning # => undefined local variable or method `morning' for main:Object (NameError)

Beispiel 2 Wenn direkt in der Klasse definiert, kann es nur innerhalb der Morning-Klasse und außerhalb von self.message verwendet werden.

local_variable.rb


class Morning

  morning = "Morgen"

  def self.message
    puts "#{morning}ist"
  end

  self.message # => undefined local variable or method `morning' for Morning:Class (NameError)

end

Instanzvariable

Fügen Sie am Anfang @ hinzu. ** Kann an einer beliebigen Stelle innerhalb einer Methode derselben Klasse aufgerufen werden. ** ** ** Sie kann auch mit einer anderen Methode als der Initialisierungsmethode definiert werden. Wenn Sie versuchen, es außerhalb des Gültigkeitsbereichs aufzurufen, wird nil zurückgegeben.

Beispiel 1 Das in der Initialisierungsmethode definierte "@ color" kann auch in der put_color-Methode verwendet werden.

instance_variable.rb


class Color
  def initialize(color)
    @color = color
  end

  def put_color
    puts @color
  end
end

color1 = Color.new("Blau")
color1.put_color # =>Blau

p @color # => nil

Beispiel 2 Definieren Sie eine andere Instanzvariable als die Initialisierungsmethode

instance_variable.rb


class Color

  def initialize(color)
    @color = color
  end

  def rank
    if @color == "Blau"
      @rank = "A"
    elsif @color == "rot"
      @rank = "B"
    end
  end

  def explain
    puts "#{@color}Rang ist#{@rank}ist"
  end

end

color1 = Color.new("Blau")
color2 = Color.new("rot")

color1.rank
color1.explain # =>Blauer Rang ist A.

color2.rank
color2.explain # =>Roter Rang ist B.

Klassenvariable

Fügen Sie am Anfang @@ hinzu. ** Kann überall in der Klasse aufgerufen werden. ** ** ** Instanzvariablen haben für jede Instanz unterschiedliche Werte, während Klassenvariablen innerhalb der Klasse gemeinsame Werte haben. Wenn Sie versuchen, es außerhalb des Gültigkeitsbereichs aufzurufen, wird der Fehler "nicht initialisierte Klassenvariable @@ 〇〇〇 in Object (NameError)" angezeigt.

Beispiel @@ monitor ist für color1 und 2 gleich

class_variable.rb


class Color

  @@monitor = "Monitor 1"
  
  def initialize(color)
    @color = color
  end

  def rank 
    if @color == "Blau"
      @rank = "A"
    elsif @color == "rot"
      @rank = "B"
    end
  end

  def explain
    puts "#{@@monitor}von#{@color}vonランクは#{@rank}ist"
  end

end

color1 = Color.new("Blau")
color2 = Color.new("rot")

color1.rank
color1.explain # =>Monitor 1 hat einen blauen Rang von A.

color2.rank
color2.explain # =>Monitor 1 hat einen roten Rang von B.

puts @@monitor #=> uninitialized class variable @@monitor in Object (NameError)

Klasseninstanzvariable

Ein Typ einer Instanzvariablen, bei der es sich um eine Instanzvariable handelt, die der Klasse selbst gehört (= direkt in der Klasse definiert). Fügen Sie also am Anfang auch @ hinzu. Der Unterschied zu normalen Instanzvariablen besteht in der Position und dem Umfang der Definition. ** Im Gegensatz zu Instanzvariablen können sie nicht aus untergeordneten Klassen referenziert werden. ** (Aufgrund des Unterschieds zwischen Instanzmethode und Klassenmethode)

Beispiel Klasseninstanzvariablen können nicht von untergeordneten Klassen referenziert werden

class_instance_variable.rb


class Color
  @color = "Blau"

  def self.put_color
    puts @color
  end
end

class DarkColor < Color
  def self.put_dark_color
    puts "Dunkel#{@color}"
  end
end

Color.put_color # =>Blau
DarkColor.put_dark_color # =>Dunkel ... Blau wird nicht ausgegeben

Globale Variablen

Fügen Sie $ am Anfang hinzu. ** Sie können es überall in Ihrem Projekt aufrufen. ** ** ** Da der Bereich zu groß ist, wird der Variablenname möglicherweise unbeabsichtigt abgedeckt und der Inhalt wird möglicherweise neu geschrieben. Verwenden Sie ihn daher nur, wenn dies unbedingt erforderlich ist.

Beispiel $ Helligkeit kann überall aufgerufen und neu geschrieben werden

global_variable.rb


$brightness = 2000

class Color

  def initialize(color)
    @color = color
  end

  def explain
    puts "Das#{@color}Die Helligkeit von#{$brightness}nt"
  end

end

color1 = Color.new("Blau")
color2 = Color.new("rot")

color1.explain # =>Seine blaue Helligkeit beträgt 2000nt

$brightness = 100000

color2.explain # =>Seine rote Helligkeit beträgt 100000nt

schließlich

Wenn Sie Eindrücke, Meinungen oder Vorschläge zu diesem Artikel haben, teilen Sie uns dies bitte mit.

Referenzquelle

https://techacademy.jp/magazine/9704 https://qiita.com/tomokichi_ruby/items/a2548176d85457f622a4 https://qiita.com/shun_takagi/items/cba48fbe8c4de81b3fac http://simanman.hatenablog.com/entry/2013/03/11/210756

Recommended Posts

[Ruby] Dies ist die Lösung. Wann sollte ich Instanzvariablen verwenden?
Als ich versuchte, das AWS SDK mit Ruby + Lambda zu verwenden, war "sam local" durcheinander.
Da der Befehl du, der bei voller Kapazität verwendet wird, schwierig zu verwenden ist, habe ich versucht, ihn mit Rubin zu umwickeln
Was soll ich für das Test-Framework verwenden [Rails]
[Swift] Das ist die Lösung! Abbildung der Implementierung des Delegierten
Eine Warnung wird angezeigt, wenn versucht wird, eine große Ganzzahl mit den speziellen Variablen $ 1, $ 2, $ 3 ... zu verwenden.
Was passiert mit Instanzvariablen beim Kopieren einer Instanz mit Ruby?
Ich habe die beiliegende Instanz untersucht.
Dies ist der erste Beitrag.
Verwenden Sie Ruby-Variablen in Javascript.
[Ruby] Was ist eine Instanz?
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]
[Ruby] Klassen, Instanzvariablen, Instanzen usw.
[Ruby] Behandeln Sie Instanzvariablen mit Instanzmethoden
Dieses Problem ist nüchtern schwierig ... (Ruby)
[Ruby] Zeigt den Inhalt von Variablen an
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen