[RUBY] Ich bin von Rails gekommen und wusste nicht, was [attr_accessor] ist

Eine Methode namens ** attr_accessor **, die häufig angezeigt wird, wenn die grundlegende Grammatik von Ruby betrachtet wird.

Als ich es zum ersten Mal sah, wusste ich nicht, wofür es verwendet wurde, als ich von Ruby on Rails eintrat.

Ich werde es von dort nachschlagen

Um ehrlich zu sein, kann ich nicht verstehen ...

Für diejenigen, die es wissen, mag es zu genau sein, um zu sagen, was es ist, aber wenn jemand an der gleichen Stelle wie ich stolpert, würde ich es begrüßen, wenn Sie sich darauf beziehen könnten.

Verwendung von attr_accessor

Zunächst die fragliche Methode ** attr_accessor **, aber kurz gesagt, es handelt sich um eine Methode **, die einer Instanz ein Attribut gibt, auf das von außen verwiesen und aktualisiert werden kann.

Ich werde eins nach dem anderen erklären.

Sie können nicht direkt auf den Wert der Instanz zugreifen

Es ist leicht zu vergessen, wenn Sie Rails verwenden, aber die Hauptvoraussetzung ist, dass Sie keinen direkten Zugriff auf ** Instanzwerte haben. ** ** **

Als Beispiel haben wir die folgende ** Hoge ** -Klasse vorbereitet. Es gibt zwei Instanzvariablen, ** Name ** und ** Alter **.

attr_accessor.rb




class Hoge

  def initialize(name, age)
    @name = name
    @age = age
  end


  def hello
    p "Hello! I'm #{@name} "
    p "I'm #{@age} old"
  end
end

hoge = Hoge.new("hogehoge",12)
hoge.hello

p hoge.name

Wenn ich in diesem Zustand versuche, den Namen auszugeben, der eine Variable von hoge ist, die eine Instanz von Hoge ist ...

"Hello! I'm hogehoge "
"I'm 12 old"
Traceback (most recent call last):
attr_accessor.rb:33:in `<main>': undefined method `name' for #<Hoge:0x0000000004e68eb8 @name="hogehoge", @age=12> (NoMethodError)

Und NoMethodError tritt auf.

Das sollte es sein. Dies liegt daran, dass es in der Hoge-Klasse keine Methode namens name gibt.

Die Methoden ** setter ** und ** getter ** lösen das Problem, dass sie nicht auf die Werte dieser Instanzen zugreifen können.

Getter

Der Getter wird verwendet, wenn Sie wie zuvor auf den Wert der Instanz verweisen möchten. Es gibt zwei Möglichkeiten, den Getter festzulegen: ** Definieren einer Methode ** und ** Verwenden einer Zugriffsmethode **.

Die Definition einer Methode ist sehr einfach

python


class Hoge

  def initialize(name, age)
    @name = name
    @age = age
  end
 
 #Realisieren Sie die Wertreferenz mit demselben Namen wie die Instanzvariable
  def name
    name = @name
  end

  def hello
    p "Hello! I'm #{@name} "
    p "I'm #{@age} old"
  end
end

Definieren Sie eine Methode, die die Instanzvariable bei der Ausführung abruft.

Dies ist jedoch etwas unkühl, daher ist es besser, die Zugriffsmethode zu verwenden.

python


class Hoge
  attr_reader :name

  def initialize(name, age)
    @name = name
    @age = age
  end


  def hello
    p "Hello! I'm #{@name} "
    p "I'm #{@age} old"
  end
end

Sie können auf den Wert der Instanzvariablen wie oben mit der Methode ** attr_reader ** verweisen. Der zu diesem Zeitpunkt definierte Wert muss ** mit dem in der Instanzvariablen ** definierten Wert übereinstimmen.

Dies ist die Rolle des Getters, um sich auf den Wert zu beziehen.

Setter

Nachdem Sie sich jetzt auf den Wert beziehen können, versuchen Sie, den Instanzwert auf dieselbe Weise wie Rails durch einen anderen Wert zu ersetzen ...

python


class Hoge

  attr_reader :name

  def initialize(name, age)
    @name = name
    @age = age
  end

  def hello
    p "Hello! I'm #{@name} "
    p "I'm #{@age} old"
  end

end

hoge = Hoge.new("hogehoge",12)
hoge.hello
p hoge.name
hoge.name = "fugafuga"


--------------------------------------------------------------------------------

"Hello! I'm hogehoge "
"I'm 12 old"
"hogehoge"
Traceback (most recent call last):
attr_accessor.rb:37:in `<main>': undefined method `name=' for #<Hoge:0x0000000004fbb040 @name="hogehoge", @age=12> (NoMethodError)
Did you mean?  name

Ich werde wieder wütend werden.

Dies liegt daran, dass ** Getter Werte sehen können, aber keine neuen Werte zuweisen können, da sie nicht die Möglichkeit zum Aktualisieren enthalten **.

Was zur Lösung dieses Problems verwendet wird, heißt ** Setter **.

Es gibt zwei Arten von Setzern: Der eine besteht darin, die Methode so zu definieren, wie sie ist, und der andere darin, die Accessor-Methode zu verwenden.

python


def name=(name)
    @name = name
end

Wenn Sie nach der Methode ** = ** hinzufügen, wird sie zum Setter. Der Inhalt ist einfach, spiegeln Sie nur das empfangene Argument in der Instanzvariablen wider.

Verwendung der Accessor-Methode.

python


class Hoge

  attr_reader :name
  attr_writer :name

  def initialize(name, age)
    @name = name
    @age = age
  end

  def hello
    p "Hello! I'm #{@name} "
    p "I'm #{@age} old"
  end
end

Die Accessor-Methode verwendet ** attr_writer **.

python


hoge = Hoge.new("hogehoge",12)
hoge.hello
p hoge.name
hoge.name = "fugafuga"
hoge.hello

------------------------------------------------------

"Hello! I'm hogehoge "
"I'm 12 old"
"hogehoge"
"Hello! I'm fugafuga "
"I'm 12 old"

Und sicherlich wurde der Wert des Namens aktualisiert.

attr_accessor

Es ist schließlich die Erklärung von attr_accessor, aber die Rolle dieser Methode besteht darin, ** sowohl für den Getter als auch für den Setter oben verantwortlich zu sein.

Mit anderen Worten, Sie müssen nicht zwei Typen schreiben, attr_reader und attr_writer

python


class Hoge
  #Diese Partei spielt die Rolle von Getter und Setter
  attr_accessor :name

  def initialize(name, age)
    @name = name
    @age = age
  end

  def hello
    p "Hello! I'm #{@name} "
    p "I'm #{@age} old"
  end
end

hoge = Hoge.new("hogehoge",12)
hoge.hello
p hoge.name
hoge.name = "fugafuga"
hoge.hello

----------------------------------------------------------

Hello! I'm hogehoge "
"I'm 12 old"
"hogehoge"
"Hello! I'm fugafuga "
"I'm 12 old"

Kann ziemlich einfach geschrieben werden.

Sie haben sich vielleicht gefragt, ob Sie so weit gelesen haben, aber Rails zeigt diese Accessor-Methode normalerweise nicht an.

Der Grund, warum der Tabellenwert wie eine Methode referenziert und aktualisiert werden kann, liegt darin, dass er automatisch von ** ActiveRecord :: Base ** festgelegt wird.

Wenn Sie möchten, habe ich auch einen Artikel darüber geschrieben. Schauen Sie also bitte vorbei. >> Schienen db: migrieren und die Existenz von Modellen

Dies ist die Erklärung von attr_accessor.

Zusammenfassung

Methode Funktion Rolle
attr_reader Getter Sie können auf den Wert der Instanzvariablen verweisen
attr_writer Setter Sie können den Wert der Instanzvariablen aktualisieren
attr_accessor Getter Setter Sie können die Werte von Instanzvariablen anzeigen und aktualisieren

Ruby on Rails ist ein sehr nützliches Framework, aber ich hatte das starke Gefühl, dass ich manchmal die Grundlagen von Ruby neu lernen musste ...

Wir empfehlen Ihnen, Ihren eigenen Code über den Inhalt dieses Bereichs zu schreiben!

Na dann

Recommended Posts

Ich bin von Rails gekommen und wusste nicht, was [attr_accessor] ist
Was ich aus dem Studium von Rails gelernt habe
Ich wusste, was Reflexion war
Wovon ich süchtig war, als ich rspec auf Schienen benutzte
Ich war überrascht, dass Rails es automatisch tat.
Eine Notiz von dem, worauf ich gestoßen bin und was ich beim Aufholen von Laravel von Rails bemerkt habe
Wovon ich süchtig war, als ich die Google-Authentifizierung mit Rails implementierte
[Rails] Was war die Fehlermeldung?
[Rails] Was ich aus einem kleinen Stolperstein bei der Verwendung von Vorfahren gelernt habe
Was ich aus der Java-Geldberechnung gelernt habe
Ich wusste nicht, was ich in Mavens Bereich schreiben sollte, also habe ich es nachgeschlagen.