1137 votes

Qu'est-ce que attr_accessor en Ruby?

Je vais avoir du mal à le comprendre, attr_accessors en Ruby, quelqu'un peut m'expliquer à moi? J'ai fait des tonnes de recherches sur Google, juste ne peut pas comprendre pleinement.

2553voto

hakunin Points 13171

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.

79voto

Phrogz Points 112337

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

49voto

efalcao Points 3332

attr_accessor est très simple:

attr_accessor :foo

est un raccourci pour:

def foo=(val)
  @foo = val
end

def foo
  @foo
end

il n'est rien de plus qu'un getter/setter pour un objet

22voto

Chuck Points 138930

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X