Je vais avoir du mal à le comprendre, attr_accessor
s en Ruby, quelqu'un peut m'expliquer à moi? J'ai fait des tonnes de recherches sur Google, juste ne peut pas comprendre pleinement.
Réponses
Trop de publicités?Disons que vous avez une classe Person
.
class Person
end
person = Person.new
person.name # => no method error
Évidemment, nous n'avons jamais défini la méthode d' name
. Faisons-le.
class Person
def name
@name # simply returning an instance variable @name
end
end
person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error
Aha, on peut lire le nom, mais cela ne signifie pas que nous pouvons lui attribuer le nom. Ceux sont deux méthodes différentes. Ancien appelé lecteur et derniers appelés écrivain. Nous n'avons pas créé l'écrivain encore si nous allons le faire.
class Person
def name
@name
end
def name=(str)
@name = str
end
end
person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"
Génial. Maintenant, nous pouvons écrire et de lire la variable d'instance, @name
à l'aide de lecteur et de l'écrivain méthodes. L'exception, c'est fait si souvent, pourquoi perdre du temps à écrire ces méthodes à chaque fois? Nous pouvons le faire plus facile.
class Person
attr_reader :name
attr_writer :name
end
Cela peut devenir répétitif. Lorsque vous souhaitez à la fois lecteur et de l'écrivain que l'utilisation de l'accesseur!
class Person
attr_accessor :name
end
person = Person.new
person.name = "Dennis"
person.name # => "Dennis"
Fonctionne de la même manière! Et devinez quoi: la variable d'instance, @name
dans notre objet sera de définir, tout comme lorsque nous avons fait manuellement, de sorte que vous pouvez l'utiliser dans d'autres méthodes.
class Person
attr_accessor :name
def greeting
"Hello #{@name}"
end
end
person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"
C'est tout. Afin de comprendre comment attr_reader
, attr_writer
, et attr_accessor
méthodes réellement générer des méthodes pour vous, lire les autres réponses, des livres, des rubis docs.
attr_accessor
"(@pst dit) juste une méthode. Ce qu'il fait est de créer plus de méthodes pour vous.
Donc ce code ici:
class Foo
attr_accessor :bar
end
est équivalent à ce code:
class Foo
def bar
@bar
end
def bar=( new_value )
@bar = new_value
end
end
Vous pouvez écrire ce genre de méthode vous-même en Ruby:
class Module
def var( method_name )
inst_variable_name = "@#{method_name}".to_sym
define_method method_name do
instance_variable_get inst_variable_name
end
define_method "#{method_name}=" do |new_value|
instance_variable_set inst_variable_name, new_value
end
end
end
class Foo
var :bar
end
f = Foo.new
p f.bar #=> nil
f.bar = 42
p f.bar #=> 42
C'est juste une méthode qui définit les méthodes getter et setter pour les variables d'instance. Un exemple de mise en œuvre serait:
def self.attr_accessor(*names)
names.each do |name|
define_method(name) {instance_variable_get("@#{name}")} # This is the getter
define_method("#{name}=") {|arg| instance_variable_set("@#{name}", arg)} # This is the setter
end
end