[Ruby] C'est la solution. Quand dois-je utiliser des variables d'instance?

Les gens qui veulent lire

** J'ai en quelque sorte compris la signification des variables d'instance, mais comment utiliser correctement les variables locales, les variables d'instance et les variables de classe après tout? ** ** À une personne comme moi dans le passé. Je pense que même les débutants peuvent l'écrire pour le comprendre en le lisant.

Conclusion: portée

** Pensez simplement à la gamme de variables que vous souhaitez utiliser. ** ** ** En d'autres termes, la portée (la plage dans laquelle les variables et les méthodes peuvent être appelées) doit être considérée </ font>. ** ** Je vais l'expliquer ci-dessous.

Types de variables pouvant être utilisées dans Ruby

  1. Variables locales
  2. Variables d'instance
  3. Variables de classe (4. variable d'instance de classe)
  4. Variables globales

Chacun a une portée différente.

Variables locales

Ne mettez aucun @ devant le nom de la variable. ** Peut être appelé uniquement dans la méthode ou la classe définie. ** ** Si vous essayez de l'appeler hors de portée, vous obtiendrez l'erreur ʻune variable ou méthode locale non définie 〇〇〇'for main: Object (NameError) .

Exemple 1 La variable morning ne peut être utilisée que dans la méthode morning_message

local_variable.rb


def morning_message
  morning = "Matin"
  puts "#{morning}est" 
end

morning_message # =>C'est le matin

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

Exemple 2 S'il est défini directement dans la classe, il ne peut être utilisé qu'à l'intérieur de la classe Morning et à l'extérieur de self.message.

local_variable.rb


class Morning

  morning = "Matin"

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

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

end

Variable d'instance

Ajoutez @ au début. ** Peut être appelé n'importe où dans une méthode de la même classe. ** ** Il peut également être défini par une méthode autre que la méthode initialize. Si vous essayez de l'appeler hors de portée, nil sera retourné.

Exemple 1 Le @ color défini dans la méthode initialize peut également être utilisé dans la méthode put_color.

instance_variable.rb


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

  def put_color
    puts @color
  end
end

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

p @color # => nil

Exemple 2 Définir une variable d'instance autre que la méthode initialize

instance_variable.rb


class Color

  def initialize(color)
    @color = color
  end

  def rank
    if @color == "Bleu"
      @rank = "A"
    elsif @color == "rouge"
      @rank = "B"
    end
  end

  def explain
    puts "#{@color}Le rang est#{@rank}est"
  end

end

color1 = Color.new("Bleu")
color2 = Color.new("rouge")

color1.rank
color1.explain # =>Le rang bleu est A

color2.rank
color2.explain # =>Le rang rouge est B

Variable de classe

Ajoutez @@ au début. ** Peut être appelé n'importe où dans la classe. ** ** Les variables d'instance ont des valeurs différentes pour chaque instance, tandis que les variables de classe ont des valeurs communes au sein de la classe. Si vous essayez de l'appeler hors de portée, vous obtiendrez l'erreur «variable de classe non initialisée @@ 〇〇〇 dans Object (NameError)».

L'exemple @@ monitor est commun à color1 et 2

class_variable.rb


class Color

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

  def rank 
    if @color == "Bleu"
      @rank = "A"
    elsif @color == "rouge"
      @rank = "B"
    end
  end

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

end

color1 = Color.new("Bleu")
color2 = Color.new("rouge")

color1.rank
color1.explain # =>Le moniteur 1 a un rang bleu de A

color2.rank
color2.explain # =>Le moniteur 1 a un rang rouge de B

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

Variable d'instance de classe

Un type de variable d'instance, qui est une variable d'instance appartenant à la classe elle-même (= définie directement dans la classe). Alors ajoutez également @ au début. La différence avec les variables d'instance ordinaires est l'emplacement et la portée de la définition. ** Contrairement aux variables d'instance, elles ne peuvent pas être référencées à partir de classes enfants. ** (En raison de la différence entre la méthode d'instance et la méthode de classe)

Exemple Les variables d'instance de classe ne peuvent pas être référencées par les classes enfants

class_instance_variable.rb


class Color
  @color = "Bleu"

  def self.put_color
    puts @color
  end
end

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

Color.put_color # =>Bleu
DarkColor.put_dark_color # =>Foncé ... Le bleu n'est pas émis

Variables globales

Ajoutez $ au début. ** Vous pouvez l'appeler n'importe où dans votre projet. ** ** Étant donné que la portée est trop large, le nom de la variable peut être accidentellement couvert et le contenu peut être réécrit, utilisez-le uniquement lorsque cela est absolument nécessaire.

Exemple $ luminosité peut être appelé et réécrit n'importe où

global_variable.rb


$brightness = 2000

class Color

  def initialize(color)
    @color = color
  end

  def explain
    puts "Cette#{@color}La luminosité de#{$brightness}NT"
  end

end

color1 = Color.new("Bleu")
color2 = Color.new("rouge")

color1.explain # =>Sa luminosité bleue est de 2000nt

$brightness = 100000

color2.explain # =>Sa luminosité rouge est de 100000nt

à la fin

Je vous serais reconnaissant de bien vouloir me faire part de vos réflexions, opinions et suggestions concernant cet article.

Source de référence

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] C'est la solution. Quand dois-je utiliser des variables d'instance?
Quand j'ai essayé d'utiliser le kit AWS SDK avec Ruby + Lambda, `sam local` était en panne.
Comme la commande du utilisée lorsque la capacité est pleine est difficile à utiliser, j'ai essayé de l'envelopper avec du rubis
Que dois-je utiliser pour le framework de test [Rails]
[Swift] C'est la solution! Illustration de la mise en œuvre du délégué
Un avertissement s'affiche lorsque vous essayez d'utiliser un entier énorme avec les variables spéciales $ 1, $ 2, $ 3 ...
Qu'advient-il des variables d'instance lors de la copie d'une instance avec ruby
J'ai enquêté sur l'instance englobante.
Ceci est le premier message.
Utilisez des variables ruby en javascript.
[Ruby] Qu'est-ce qu'une instance?
[RSpec] Lorsque vous souhaitez utiliser la variable d'instance du contrôleur dans le test [attribuer n'est pas recommandé]
[Ruby] Classes, variables d'instance, instances, etc ...
[Ruby] Gérez les variables d'instance avec des méthodes d'instance
Ce problème est sobrement difficile ... (Ruby)
[Ruby] Afficher le contenu des variables
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby