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

Zmienne w Ruby: @, @@ oraz zmienna instancji klasy

Okładka posta: Zmienne w Ruby: @, @@ oraz zmienna instancji klasy
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby istnieje kilka typów zmiennych, które różnią się tym, do kogo należą - do obiektu, klasy czy wszystkich potomków jednocześnie. Rozważmy to prosto i na przykładach.

@ - zmienna instancji (instance variable)

To zwykła zmienna, która należy do konkretnego obiektu. Każda instancja klasy (obiekt) ma swoją własną kopię takiej zmiennej.
class User
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

u1 = User.new("Oleh")
u2 = User.new("Ira")

u1.name  # => "Oleh"
u2.name  # => "Ira"
Każdy użytkownik ma swoje imię. @name nie dzieli się między obiektami - to ich dane osobowe.

@@ - zmienna klasy (class variable)

Zmienna z dwoma znakami @ (@@) jest wspólna dla wszystkich instancji i podklas. Żyje w całej hierarchii klas.
class Animal
  @@count = 0

  def initialize
    @@count += 1
  end

  def self.count
    @@count
  end
end

class Dog < Animal; end

a1 = Animal.new
d1 = Dog.new

Animal.count  # => 2
Dog.count     # => 2
Zarówno Animal, jak i Dog widzą tę samą zmienną @@count. Jeśli podklasa ją zmienia - wpływa to na klasę nadrzędną. Z tego powodu @@ uważane są za niebezpieczną i przestarzałą praktykę - lepiej unikać ich użycia.

Zmienna instancji klasy - bezpieczna alternatywa dla @@

Można stworzyć zmienną na poziomie klasy, ale tak, aby należała tylko do tej klasy, a nie do jej dziedziców. To zwykła zmienna @, ale zadeklarowana na poziomie samej klasy (a nie wewnątrz initialize).
class User
  @count = 0

  def self.add_user
    @count += 1
  end

  def self.count
    @count
  end
end

class Admin < User; end

User.add_user
User.count   # => 1
Admin.count  # => nil
W tym przykładzie User ma swoją własną @count, a Admin - oddzielną (początkowo nil, dopóki nie zostanie zdefiniowana). To sprawia, że kod jest bezpieczny i przewidywalny.

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

==, equal?, eql?, === w Ruby: co sprawdzają i kiedy używać
29 paź 20:47

==, equal?, eql?, === w Ruby: co sprawdzają i kiedy używać

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Include, Extend, Prepend w Ruby: jak działają i jaka jest różnica
29 paź 21:20

Include, Extend, Prepend w Ruby: jak działają i jaka jest różnica

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
module_function w Ruby: kiedy metody modułu są dostępne jako modułowe i jako funkcje
29 paź 21:53

module_function w Ruby: kiedy metody modułu są dostępne jako modułowe i jako funkcje

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Czym jest memoizacja w Ruby?
30 paź 10:17

Czym jest memoizacja w Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
is_a?, kind_of?, instance_of? — jak Ruby sprawdza typ obiektu?
30 paź 19:55

is_a?, kind_of?, instance_of? — jak Ruby sprawdza typ obiektu?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
&& vs and — różnica w Ruby, która może zepsuć twój kod
30 paź 20:23

&& vs and — różnica w Ruby, która może zepsuć twój kod

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Różnica między blank?, present?, empty? a nil? w Ruby
30 paź 21:06

Różnica między blank?, present?, empty? a nil? w Ruby

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Czym jest Middleware w Ruby on Rails i kiedy jest używane
4 lis 10:39

Czym jest Middleware w Ruby on Rails i kiedy jest używane

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Czym jest podejście Vanilla Rails?
14 lis 16:48

Czym jest podejście Vanilla Rails?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Czym jest Elasticsearch i jak działa?
22 lis 12:35

Czym jest Elasticsearch i jak działa?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Czym jest baza danych typu time-series?
22 lis 12:42

Czym jest baza danych typu time-series?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
22 lis 12:49

Co to jest VACUUM w PostgreSQL?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska