Czym jest attr accessor w Ruby?

Trudno mi zrozumieć Ruby. Czy ktoś może mi to wyjaśnić?

 889
Author: codeforester, 2010-12-07

18 answers

Powiedzmy, że masz klasę Person.

class Person
end

person = Person.new
person.name # => no method error

Oczywiście nigdy nie zdefiniowaliśmy metody name. Zróbmy to.

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, możemy odczytać imię, ale to nie znaczy, że możemy przypisać imię. To dwie różne metody. Ten pierwszy nazywa się reader , a drugi nazywa się writer . Nie stworzyliśmy jeszcze pisarza, więc zróbmy to.

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"

Super. Teraz możemy zapisywać i odczytywać zmienną instancji @name za pomocą metod reader i writer. Z wyjątkiem, robi się to tak często, po co tracić czas na pisanie tych metod za każdym razem? Możemy to zrobić łatwiej.

class Person
  attr_reader :name
  attr_writer :name
end

Nawet to może się powtarzać. Jeśli chcesz zarówno reader i writer po prostu użyj accessor!

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Dennis"
person.name # => "Dennis"

Działa tak samo! I zgadnij co: zmienna instancji @name w naszym obiekcie person zostanie ustawiona tak samo jak wtedy, gdy zrobiliśmy to ręcznie, więc możesz używać jej w innych metodach.

class Person
  attr_accessor :name

  def greeting
    "Hello #{@name}"
  end
end

person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"

To jest to. Aby zrozumieć jak attr_reader, attr_writer, i attr_accessor metody faktycznie Generuj metody dla Ciebie, Czytaj inne odpowiedzi, książki, Ruby docs.

 2080
Author: Max Chernyak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-10 21:28:46

Attr_accessor jest tylko metodą. (Link powinien zapewnić więcej wglądu w to, jak to działa-spójrz na pary wygenerowanych metod, a samouczek powinien pokazać, jak z niego korzystać.)

Sztuczka polega na tym, że class jest nie definicją W Rubim (jest "tylko definicją" w językach takich jak C++ i Java), ale jest wyrażeniem , które ocenia. Podczas tej oceny jest wywoływana metoda attr_accessor, która z kolei modyfikuje bieżącą klasę - remember the implicit receiver: self.attr_accessor, Gdzie self jest obiektem klasy "open" w tym punkcie.

Potrzeba attr_accessor i przyjaciół, jest, cóż:

  1. Ruby, podobnie jak Smalltalk, nie pozwala na dostęp do zmiennych instancji poza metodami1 za ten przedmiot. Oznacza to, że zmienne instancji nie mogą być dostępne w formie x.y, Jak to jest powszechne w say, Java lub nawet Python. W Ruby {[6] } jest zawsze traktowana jako wiadomość do wysłania (lub"metoda do wywołania"). Zatem metody {[7] } tworzy wrappery, które zastępują instancję @variable dostęp za pomocą dynamicznie tworzonych metod.

  2. Boilerplate sucks

Mam nadzieję, że to wyjaśnia niektóre szczegóły. Szczęśliwego kodowania.


1 nie jest to ściśle prawda i istnieją pewne "techniki" wokół tego , ale nie ma wsparcia składni dla dostępu do "zmiennej instancji publicznej".

 115
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:48

attr_accessor jest (jak stwierdził @pst) tylko metodą. To, co robi, to tworzenie więcej metod dla Ciebie.

Więc ten kod tutaj:

class Foo
  attr_accessor :bar
end

Jest odpowiednikiem tego kodu:

class Foo
  def bar
    @bar
  end
  def bar=( new_value )
    @bar = new_value
  end
end

Możesz napisać ten rodzaj metody samodzielnie w 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
 63
Author: Phrogz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-06 21:29:34

attr_accessor jest bardzo proste:

attr_accessor :foo

Jest skrótem od:

def foo=(val)
  @foo = val
end

def foo
  @foo
end

Jest to nic innego jak getter / setter dla obiektu

 35
Author: efalcao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-06 21:28:47

Zasadniczo fałszują publicznie dostępne atrybuty danych, których Ruby nie ma.

 17
Author: Tyler Eaves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-06 21:11:11

Jest to po prostu metoda, która definiuje metody getter i setter na przykład zmienne. Przykładowa implementacja to:

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
 17
Author: Chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-06 21:29:29

Ja również zmierzyłem się z tym problemem i napisałem dość długą odpowiedź na to pytanie. Istnieje już kilka świetnych odpowiedzi na ten temat, ale każdy, kto szuka więcej wyjaśnień, mam nadzieję, że moja odpowiedź może pomóc

Initialize Method

Initialize pozwala na ustawienie danych do instancji obiektu po utworzeniu instancji, zamiast ustawiać je w osobnej linii kodu za każdym razem, gdy tworzysz nową instancję klasy.

class Person
  attr_accessor :name

  def initialize(name)
    @name = name
  end


  def greeting
    "Hello #{@name}"
  end
end

person = Person.new("Denis")
puts person.greeting

W powyższym kodzie jesteśmy ustawianie nazwy "Denis" za pomocą metody initialize poprzez przekazanie Dennisa przez parametr w Initialize. Jeśli chcemy ustawić nazwę Bez metody initialize, możemy zrobić to w następujący sposób:

class Person
  attr_accessor :name

  # def initialize(name)
  #     @name = name
  # end

  def greeting
    "Hello #{name}"
  end
end

person = Person.new
person.name = "Dennis"
puts person.greeting

W powyższym kodzie ustawiamy nazwę wywołując metodę attr_accessor setter używając person.name, zamiast ustawiać wartości przy inicjalizacji obiektu.

Obie "metody" wykonywania tej pracy, ale initialize oszczędza nam czas i linie kodu.

To jest tylko zadanie inicjalizacji. Nie można wywołać initialize jako metody. Aby uzyskać wartości obiektu instancji, należy użyć getterów i setterów (attr_reader( get), attr_writer (set) i attr_accessor (both)). Więcej szczegółów na ten temat można znaleźć poniżej.

Getters, Setters (attr_reader, attr_writer, attr_accessor)

Getters, attr_reader: celem gettera jest zwrócenie wartości konkretnej zmiennej instancji. Odwiedź poniższy przykładowy kod, aby uzyskać informacje na ten temat.

class Item

  def initialize(item_name, quantity)
    @item_name = item_name
    @quantity = quantity
  end

  def item_name
    @item_name
  end

  def quantity
     @quantity
  end
end

example = Item.new("TV",2)
puts example.item_name
puts example.quantity

W powyższym kodzie wywołujesz metody "item_name" i " quantity "na instancji elementu"example". Przykład " puts.item_name " i " przykład.quantity "zwróci (lub" get") wartość parametrów, które zostały przekazane do "przykładu"i wyświetli je na ekranie.

Na szczęście w Rubim istnieje nieodłączna metoda, która pozwala nam pisać ten kod bardziej zwięźle; metoda attr_reader. Zobacz poniższy kod;

class Item

attr_reader :item_name, :quantity

  def initialize(item_name, quantity)
    @item_name = item_name
    @quantity = quantity
  end

end

item = Item.new("TV",2)
puts item.item_name
puts item.quantity

Ta składnia działa dokładnie tak w ten sam sposób, tylko to oszczędza nam sześć linijek kodu. Wyobraź sobie, że masz jeszcze 5 Stanów przypisanych do klasy przedmiotów? Kod szybko się wydłuży.

Setters, attr_writer: to, co na początku skrzyżowało mnie z metodami setter, to to, że w moich oczach wydawało mi się, że spełnia ona identyczną funkcję jak metoda initialize. Poniżej wyjaśniam różnicę na podstawie mojego zrozumienia;

Jak podano wcześniej, metoda initialize pozwala ustawić wartości dla instancji obiektu po obiekcie stworzenie.

Ale co zrobić, jeśli chcesz ustawić wartości później, po utworzeniu instancji, lub zmienić je po ich zainicjowaniu? Byłby to scenariusz, w którym można by użyć metody settera. NA TYM POLEGA RÓŻNICA. Nie musisz "ustawiać" określonego stanu, gdy używasz początkowo metody attr_writer.

Poniższy kod jest przykładem użycia metody setter do zadeklarowania wartości item_name dla tej instancji klasy Item. Zauważ, że w dalszym ciągu użyj metody getter attr_reader, abyśmy mogli pobrać wartości i wydrukować je na ekranie, na wszelki wypadek, gdybyś chciał przetestować kod samodzielnie.

class Item

attr_reader :item_name

  def item_name=(str)
    @item_name = (str)
  end

end

Poniższy kod jest przykładem użycia attr_writer, aby ponownie skrócić nasz kod i zaoszczędzić nam czasu.

class Item

attr_reader :item_name
attr_writer :item_name

end

item = Item.new
puts item.item_name = "TV"

Poniższy kod jest powtórzeniem powyższego przykładu initialize, gdzie używamy initialize, aby ustawić wartość obiektów item_name podczas tworzenia.

class Item

attr_reader :item_name

  def initialize(item_name)
    @item_name = item_name
  end

end

item = Item.new("TV")
puts item.item_name

Attr_accessor: wykonuje funkcje obu attr_reader i attr_writer, zapisując Ci jeszcze jedną linię kodu.

 12
Author: Jbur43,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-05 00:12:45

Myślę, że część tego, co myli nowych Rubyistów / programistów (jak ja), to:

"Dlaczego nie mogę po prostu powiedzieć instancji, która ma dany atrybut (np. nazwa) i nadać temu atrybutowi wartość za jednym zamachem?"

Trochę bardziej uogólnione, ale tak mi się urwało:

Podane:

class Person
end

Nie zdefiniowaliśmy osobyjako czegoś, co może mieć nazwę lub jakiekolwiek inne atrybuty w tym zakresie.

Więc jeśli wtedy:

baby = Person.new

...i spróbuj podaj im nazwisko...

baby.name = "Ruth"

Otrzymujemy błąd ponieważ w Rubyland Klasa obiektu osoby nie jest czymś, co jest związane lub zdolne do posiadania "nazwy"... jeszcze!

Ale możemy użyć dowolnej z podanych metod (Zobacz poprzednie odpowiedzi) jako sposób na powiedzenie: "instancja klasy Person (baby) możemy teraz mieć atrybut o nazwie 'name' , dlatego nie tylko mamy składniowy sposób uzyskiwania i ustawiania tej nazwy, ale ma to dla nas sens więc."

Ponownie, uderzając w to pytanie z nieco innej i bardziej ogólnej perspektywy, ale mam nadzieję, że pomoże to następnej instancji klasy, która znajdzie drogę do tego wątku.

 10
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-26 01:24:36

Jeśli znasz pojęcie OOP, musisz znać metodę getter i setter. attr_accessor robi to samo w Rubim.

Getter i Setter w sposób ogólny

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Eshaan'
person.name # => "Eshaan"

Metoda Settera

def name=(val)
  @name = val
end

Metoda Getter

def name
  @name
end

Metoda Getter i Setter w Ruby

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Eshaan"
person.name # => "Eshaan"
 10
Author: Ahmed Eshaan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-04 14:59:39

Większość powyższych odpowiedzi używa kodu. To Wyjaśnienie próbuje na nie odpowiedzieć bez użycia żadnego kodu:

Wyjaśnienie przez analogię

Strony zewnętrzne nie mogą uzyskać dostępu do wewnętrznych tajemnic CIA

  • Wyobraźmy sobie naprawdę tajne miejsce: CIA. Nikt nie wie, co się dzieje w CIA, poza ludźmi wewnątrz CIA. Innymi słowy, ludzie zewnętrzni nie mogą uzyskać dostępu do żadnych informacji w CIA. Ale ponieważ nie jest dobrze mieć organizację, która jest całkowicie tajne, pewne informacje są udostępniane światu zewnętrznemu - tylko rzeczy, o których CIA chce, aby wszyscy wiedzieli, oczywiście: np. dyrektor CIA, jak przyjazny dla środowiska ten dział jest porównywany do wszystkich innych departamentów rządowych itp. Inne informacje: np. kim są jego tajni agenci w Iraku lub Afganistanie - tego typu rzeczy prawdopodobnie pozostaną tajemnicą przez następne 150 lat.

  • Jeśli jesteś poza CIA masz dostęp tylko informacje, które udostępnił publicznie. Lub użyć języka CIA można uzyskać dostęp tylko do informacji, które są "wyczyszczone".

  • Informacje, które CIA chce udostępnić opinii publicznej poza CIA są nazywane: atrybuty.

Znaczenie atrybutów odczytu i zapisu:

  • W przypadku CIA większość atrybutów to "tylko do odczytu". Oznacza to, że jeśli jesteś stroną zewnętrzną do CIA, możesz zapytać: "kto jest dyrektorem CIA?"i otrzymasz prostą odpowiedź. Ale to, czego nie możesz zrobić z atrybutami "tylko do odczytu", to wprowadzić zmiany w CIA. na przykład nie możesz zadzwonić i nagle zdecydować , że chcesz, aby Kim Kardashian był dyrektorem, lub że chcesz, aby Paris Hilton był głównodowodzącym.

  • Jeśli atrybuty dały ci dostęp do "zapisu", to możesz wprowadzać zmiany, jeśli chcesz, nawet jeśli Na Zewnątrz. W przeciwnym razie możesz tylko czytać.

    Innymi słowy accessory pozwalają na zadawanie pytań lub wprowadzanie zmian w organizacjach, które w przeciwnym razie nie wpuszczają osób zewnętrznych, w zależności od tego, czy accessory są accessorami do odczytu czy zapisu.

Obiekty wewnątrz klasy mogą łatwo uzyskać dostęp do siebie

    Z drugiej strony, gdybyś był już w CIA, mógłbyś zadzwonić do swojego agenta CIA w Kabulu. i spytaj go, czy chce po pracy napić się piwa z lokalnym informatorem z Kabulu. Ale jeśli jesteś poza CIA, po prostu nie otrzymasz dostępu: nie będziesz w stanie wiedzieć, kim są (dostęp do odczytu) i nie będziesz w stanie zmienić ich misji (dostęp do zapisu).

Dokładnie to samo z klasami i możliwością dostępu do zmiennych, właściwości i metod wewnątrz nich. HTH! Wszelkie pytania, proszę pytać i mam nadzieję, że mogę wyjaśnić.

 10
Author: BKSpurgeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-15 13:56:04

Po prostu zdefiniuje setter i getter dla klasy.

Zauważ, że

attr_reader :v is equivalant to 
def v
  @v
end

attr_writer :v is equivalant to
def v=(value)
  @v=value
end

Więc

attr_accessor :v which means 
attr_reader :v; attr_writer :v 

Są równoważne do zdefiniowania settera i gettera dla klasy.

 7
Author: Marcus Thornton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-12 08:30:42

Po prostu attr-accessor tworzy metody getter i setter dla określonych atrybutów

 5
Author: Veeru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-17 11:05:49

Innym sposobem, aby to zrozumieć, jest ustalenie, jaki kod błędu eliminuje poprzez attr_accessor.

Przykład:

class BankAccount    
  def initialize( account_owner )
    @owner = account_owner
    @balance = 0
  end

  def deposit( amount )
    @balance = @balance + amount
  end

  def withdraw( amount )
    @balance = @balance - amount
  end
end

Dostępne są następujące metody:

$ bankie = BankAccout.new("Iggy")
$ bankie 
$ bankie.deposit(100)
$ bankie.withdraw(5)

Następujące metody powodują błąd:

$ bankie.owner     #undefined method `owner'... 
$ bankie.balance   #undefined method `balance'...

owner i balance nie są, technicznie, metodą, ale atrybutem. Klasa BankAccount nie posiada def owner i def balance. Jeśli tak, możesz użyć dwóch poniższych poleceń. Ale tych dwóch metod nie ma. Jednak można access atrybuty tak, jakbyś miał dostęp do metody poprzez attr_accessor!! stąd słowo attr_accessor. Atrybut. / Align = "left" / Uzyskuje dostęp do atrybutów tak, jak można uzyskać dostęp do metody.

Dodanie attr_accessor :balance, :owner pozwala na odczyt i zapis balance oraz owner "metoda". Teraz możesz użyć ostatnich 2 metod.

$ bankie.balance
$ bankie.owner
 4
Author: Iggy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 18:26:41

Definiuje nazwany atrybut dla tego modułu, gdzie nazwa to symbol. id2name, tworząc zmienną instancji (@name) I odpowiadającą jej metodę dostępu do jej odczytu. Tworzy również metodę nazwaną name=, aby ustawić atrybut.

module Mod
  attr_accessor(:one, :two)
end
Mod.instance_methods.sort   #=> [:one, :one=, :two, :two=]
 2
Author: Praveen_Shukla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-11 16:12:37

Podsumowując atrybut accessor aka attr_accessor daje dwie darmowe metody.

Tak jak w Javie nazywają się getters i setters.

Wiele odpowiedzi pokazało dobre przykłady, więc powiem krótko.

#the_attribute

I

#the_attribute=

W starym Ruby docs tag hash # oznacza metodę. Może również zawierać przedrostek nazwy klasy... MyClass # my_method

 1
Author: Douglas G. Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-14 03:56:47

Atrybuty i metody dostępu

Atrybuty są składnikami klas, do których dostęp można uzyskać spoza obiektu. Są one znane jako właściwości w wielu innych językach programowania. Ich wartości są dostępne za pomocą "notacji kropkowej", jak w object_name.attribute_name. W przeciwieństwie do Pythona i kilku innych języków, Ruby nie pozwala na dostęp do zmiennych instancji bezpośrednio spoza obiektu.

class Car
  def initialize
    @wheels = 4  # This is an instance variable
  end
end

c = Car.new
c.wheels     # Output: NoMethodError: undefined method `wheels' for #<Car:0x00000000d43500>

W powyższym przykładzie c jest instancją (obiektem) klasy samochodów. Bezskutecznie próbowaliśmy odczytać wartość zmiennej instancji wheels spoza obiektu. Stało się tak, że Ruby próbował wywołać metodę o nazwie wheels wewnątrz obiektu c, ale żadna taka metoda nie została zdefiniowana. Krótko mówiąc, object_name.attribute_name próbuje wywołać metodę o nazwie attribute_name wewnątrz obiektu. Aby uzyskać dostęp do wartości zmiennej wheels z zewnątrz, musimy zaimplementować metodę instancji o tej nazwie, która zwróci wartość tej zmiennej po wywołaniu. To nazywana metodą accessor. W ogólnym kontekście programowania, typowym sposobem dostępu do zmiennej instancji spoza obiektu jest implementacja metod accessora, znanych również jako metody getter i setter. Getter pozwala na odczyt wartości zmiennej zdefiniowanej w klasie z zewnątrz, a setter pozwala na zapisanie jej z zewnątrz.

W poniższym przykładzie dodaliśmy metody getter i setter do klasy samochodu, aby uzyskać dostęp do zmiennych kół z zewnątrz obiekt. Nie jest to "Ruby sposób" definiowania getterów i setterów; służy tylko do zilustrowania tego, co robią metody getter i setter.

class Car
  def wheels  # getter method
    @wheels
  end

  def wheels=(val)  # setter method
    @wheels = val
  end
end

f = Car.new
f.wheels = 4  # The setter method was invoked
f.wheels  # The getter method was invoked
# Output: => 4

Powyższy przykład działa i podobny kod jest powszechnie używany do tworzenia metod getter i setter w innych językach. Jednak Ruby zapewnia prostszy sposób: trzy wbudowane metody o nazwie attr_reader, attr_writer i attr_acessor. Metoda attr_reader sprawia, że zmienna instancji jest czytelna z zewnątrz, attr_writer sprawia, że można ją zapisać, a attr_acessor czyni go czytelnym i możliwym do zapisu.

Powyższy przykład można przepisać w ten sposób.

class Car
  attr_accessor :wheels
end

f = Car.new
f.wheels = 4
f.wheels  # Output: => 4

W powyższym przykładzie atrybut wheels będzie czytelny i możliwy do zapisania spoza obiektu. Jeśli zamiast attr_accessor użyjemy attr_reader, będzie to tylko do odczytu. Jeśli użyjemy attr_writer, będzie to tylko do zapisu. Te trzy metody nie są same w sobie getterami i setterami, ale kiedy są wywoływane, tworzą dla nas metody getter i setter. Są to metody, które dynamicznie (programowo) generować inne metody; to się nazywa metaprogramowanie.

Pierwszy (dłuższy) przykład, który nie wykorzystuje wbudowanych metod Ruby, powinien być używany tylko wtedy, gdy wymagany jest dodatkowy kod w metodach getter i setter. Na przykład metoda setter może wymagać walidacji danych lub wykonania obliczeń przed przypisaniem wartości do zmiennej instancji.

Możliwy jest dostęp (odczyt i zapis) zmiennych instancji spoza obiektu, za pomocą wbudowane metody instance_variable_get i instance_variable_set. Jest to jednak rzadko uzasadnione i zazwyczaj jest to zły pomysł, ponieważ ominięcie hermetyzacji ma tendencję do siania wszelkiego rodzaju spustoszeń.

 0
Author: BrunoFacca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-05 11:41:58

Hmmm. Wiele dobrych odpowiedzi. Oto moje kilka centów.

  • attr_accessor jest prostą metodą, która pomaga nam w czyszczeniu (na sucho ) w górę powtarzanie getter and setter metody.

  • Abyśmy mogli skupić się bardziej na pisaniu logiki biznesowej i nie martwić się o setterów i getterów.

 -1
Author: Abibullah Rahamathulah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-29 09:50:08

Główną funkcjonalnością attr_accessor nad innymi jest możliwość dostępu do danych z innych plików.
Więc zwykle masz attr_reader lub attr_writer, ale dobrą wiadomością jest to, że Ruby pozwala Ci połączyć te dwie rzeczy razem z attr_accessor. Myślę o tym jak moja metoda to go ponieważ jest bardziej zaokrąglony lub wszechstronny. Pamiętaj też, że w Rails jest to eliminowane, ponieważ robi to za Ciebie z tyłu. Innymi słowy: jesteś lepiej używać attr_acessor nad pozostałymi dwoma, ponieważ nie musisz się martwić o to, że jesteś konkretny, accessor Pokrywa to wszystko. Wiem, że jest to bardziej ogólne wyjaśnienie, ale pomogło mi jako początkującemu.

Mam nadzieję, że to pomogło!

 -3
Author: creativegeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-17 15:40:55