Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Co to jest attr_accessor, attr_reader i attr_writer w Ruby? Do czego są potrzebne?

Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby attr_accessor jest makrem (lub metodą) do automatycznego tworzenia getterów (metod dostępu do wartości) oraz setterów (metod ustawiających wartość) dla zmiennych instancji (instance variables) w klasie.
Na przykład:
class Cat
end

cat = Cat.new
cat.name # => no method error
Nie mamy metody name w klasie Cat. Oczywiście otrzymujemy no method error.
Spróbujmy dodać getter:
class Cat
  def name
    @name # zwraca zmienną instancji @name
  end
end

cat = Cat.new
cat.name # => nil
Wygląda na to, że coś poszło nie tak. Ale wszystko jest w porządku. Getter cat.name zwraca nil. Już nie ma błędu 'no method error', czyli metoda istnieje i zwraca zmienną @name instancji Cat. Ale ta zmienna jest pusta. nil to oczekiwany wynik.
W Ruby getter jest metodą, która pozwala uzyskać wartość zmiennej instancji (instance variable) w klasie. Gettery nazywają się tak, ponieważ pozwalają "uzyskiwać" (get) wartość zmiennej.
W Ruby gettery są zazwyczaj używane do zapewnienia dostępu do wartości zmiennych z zewnątrz klasy, ponieważ zmienne są zazwyczaj prywatne (private) i niedostępne bezpośrednio. Gettery pozwalają zapewnić kontrolowany dostęp do tych wartości.
Próba użycia settera zwraca błąd no method error:
cat.name = 'Ruby'# => no method error
To też jest oczekiwany wynik. Nie mamy metody setter dla name.
W Ruby setter jest metodą, która pozwala ustawić wartość zmiennej instancji (instance variable) w klasie. Settery nazywają się tak, ponieważ pozwalają "ustawiać" (set) (lub zmieniać istniejące) wartości zmiennej.
W Ruby settery są używane do kontrolowanego zmieniania wartości zmiennych z zewnątrz klasy. 
class Cat
  def name
    @name # zwraca zmienną instancji @name
  end

  def name=(str)
    @name = str
  end
end
Stwórzmy instancję Cat i wywołajmy metodę name (getter):
cat = Cat.new
cat.name # => nil
Tu wszystko jest w porządku. Nasza instancja jest obecnie pusta. Musimy przekazać wartość za pomocą naszej nowej metody (settera).
cat.name = 'Ruby'
Nie widzimy żadnego błędu. Spróbujmy więc za pomocą getter metody wyciągnąć wartość:
cat.name # => Ruby
Wszystko działa. Ale wyobraź sobie, że twoja klasa ma nie tylko name, ale dziesiątki różnych atrybutów (wiek, kolor itd.). Pisanie getterów i setterów za każdym razem nie jest zbyt wygodne.
Dlatego w Ruby istnieją takie skróty (attr_reader i attr_writer):
class Cat
  attr_reader :name
  attr_writer :name
end
 
:name - nazwa atrybutu, dla którego tworzony jest metod.
attr_reader - to skrót dla metody getter:
def name
  @name # zwraca zmienną instancji @name
end
attr_writer - to skrót dla metody setter:
def name=(str)
  @name = str
end
Jednak gdy potrzebujemy obu metod - settera i gettera, attr_reader i attr_writer musimy powtarzać dla każdego atrybutu:
class Cat
  attr_reader :name
  attr_writer :name
  attr_reader :color
  attr_writer :color
end
To jest bardziej zwięzłe niż pisanie metod w całości, ale Ruby pozwala jeszcze bardziej skrócić ten kod. Tutaj potrzebujemy attr_accessor.
class Cat
  attr_accessor :name
  attr_accessor :color
end
Równoznaczne z zapisem:
class Cat
  attr_reader :name
  attr_writer :name
  attr_reader :color
  attr_writer :color
end
Użycie attr_accessor, attr_reader i attr_writer upraszcza tworzenie metod dostępu do zmiennych w klasach, co jest szczególnie wygodne, gdy potrzebujesz tylko po prostu uzyskać lub ustawić wartość zmiennej, bez dodatkowej logiki.
Ruby pozwala skrócić już to, co wydaje się, że już skróciłeś. Oto wersja skróconego zapisu atrybutów przez przecinek:
attr_reader :name, :color

Ten post nie ma jeszcze żadnych dodatków od autora.

10 maj 17:40

Jak używać kolorów szesnastkowych CSS z wartością alfa?

meme code
meme code@memecode
16 maj 20:02

Co to jest Origin w Git?

meme code
meme code@memecode
16 maj 22:17

Jak usunąć odstęp między elementami inline a inline-block?

meme code
meme code@memecode
17 maj 18:52

Co to jest loop w Javascript? Jak działają pętle for i while w Javascript?

meme code
meme code@memecode
22 maj 16:26

Jaka jest różnica między <%, <%=, <%# a -%> w szablonach ERB (Ruby on Rails)?

meme code
meme code@memecode
23 maj 06:57

Czym jest debugowanie (debugging)?

meme code
meme code@memecode
23 maj 11:16

Jak działa związek has_many through (wiele do wielu) w Ruby on Rails?

meme code
meme code@memecode
24 maj 18:53

Czym są joins w Ruby on Rails i jak to działa?

meme code
meme code@memecode
2 cze 06:42

Błąd dodawania osób do Google Family. Nie udało się załadować strony.

meme code
meme code@memecode
2 cze 12:53

Co robi super w Ruby?

meme code
meme code@memecode
4 cze 21:19

Jak sklonować repozytorium GitHub?

meme code
meme code@memecode
23 cze 12:07

Czym jest Ubuntu? Do czego jest używane?

meme code
meme code@memecode