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

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

Okładka posta: ==, equal?, eql?, === w Ruby: co sprawdzają i kiedy używać
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby istnieje kilka sposobów porównywania. Na pierwszy rzut oka są podobne, ale działają zupełnie inaczej.

== (sprawdzanie równości wartości)

  • Sprawdza, czy obie obiekty mają tę samą zawartość.
  • Często jest przesłaniane w klasach (String, Array, Hash), aby porównywać wartości, a nie tożsamość.
a = "hello"
b = "hello"

a == b        # => true
a.equal?(b)   # => false
== pyta: "Czy te obiekty mają tę samą zawartość?"

equal? (sprawdzanie tożsamości obiektów)

  • Sprawdza, czy to ten sam obiekt w pamięci.
  • Nie jest przesłaniane w klasach, zawsze porównuje identyfikatory obiektów.
a = "hello"
b = "hello"
c = a

a.equal?(b)  # => false
a.equal?(c)  # => true
Aby zrozumieć to wszystko, trzeba wiedzieć, czym jest obiekt w Ruby.

eql? (ścisłe sprawdzanie równości dla hashy i liczb)

  • Sprawdza wartość i typ.
  • Głównie używane w hashach dla kluczy.
1 == 1.0     # => true
1.eql?(1.0)  # => false, ponieważ różne klasy (Integer vs Float)
eql? jest bardziej rygorystyczne niż ==.

=== (operator dopasowania)

  • Używane głównie w konstrukcji case (omówimy to poniżej).
  • Dla różnych klas zachowuje się różnie:
    • W klasach (String, Integer) - sprawdza, czy obiekt należy do klasy (is_a?).
    • W wyrażeniach regularnych - sprawdza, czy ciąg pasuje do wzorca.
    • W Range - czy obiekt mieści się w zakresie.
case 5
when 1..10
  "W zakresie"   # => "W zakresie"
end

String === "hello"  # => true
/ell/ === "hello"   # => true
Przyjrzyjmy się nieco bliżej przykładzie z case. Jak działa case … when w Ruby?
Składnia:
case obiekt
when wzorzec1
  kod1
when wzorzec2
  kod2
else
  kod_domyslny
end
Co się dzieje pod maską
Ruby robi mniej więcej tak:
if wzorzec1 === obiekt
  kod1
elsif wzorzec2 === obiekt
  kod2
else
  kod_domyslny
end
To znaczy, że when automatycznie używa === do porównania z wartością case. 
Poniżej przykłady dla różnych typów
Zakres (Range)
case 5
when 1..10
  "W zakresie"
else
  "Poza zakresem"
end
# => "W zakresie"
Działa tak, jakby Ruby wykonywał (to pseudokod):
(1..10) === 5  # => true
Jednak ważne jest, aby zauważyć, że zwykłe użycie === na liczbach czy innych typach niekoniecznie działa tak samo:
10 === (1..20)   # => false
10 == (1..20)    # => false
(1..20) == 10    # => false
Tu Range#=== sprawdza, czy liczba mieści się w zakresie.
Klasa
case "hello"
when String
  "To jest ciąg"
when Integer
  "To jest liczba"
end
# => "To jest ciąg"
Ruby wykonuje:
String === "hello"   # => true
Integer === "hello"  # => false
Dla klas === to skrót dla obj.is_a?(Klasa).
c) Wyrażenie regularne
case "hello"
when /ell/
  "Dopasowanie do wzorca"
else
  "Brak dopasowania"
end
# => "Dopasowanie do wzorca"
Pod maską:
/ell/ === "hello"   # => true
Dla Regexp === sprawdza, czy ciąg odpowiada wzorcowi.
Odeszliśmy nieco od tematu === i przeszliśmy do case (bo tam === jest pod maską). Taki prosty operator, ale robi różne rzeczy.
Aby łatwiej zapamiętać:
  • case x; when y - to nie x == y, ale y === x.
  • === działa różnie w zależności od typu y:
    • Class -> is_a?
    • Range -> include?
    • Regexp -> =~ (dopasowanie ciągu)
To pozwala na bardzo elastyczne pisanie warunków.

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

Jak działa self, protected i private (Ruby)
28 paź 13:52

Jak działa self, protected i private (Ruby)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Dzielenie całkowite w Ruby: dlaczego 6 / 4 równa się 1
28 paź 14:10

Dzielenie całkowite w Ruby: dlaczego 6 / 4 równa się 1

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
28 paź 14:42

Jak działa &:to_s w Ruby i co to jest Symbol#to_proc

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Co to jest Proc i Lambda w Ruby?
28 paź 15:57

Co to jest Proc i Lambda w Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Co się stanie, jeśli wywołasz [1, 2, 3].map(&Person)
29 paź 17:54

Co się stanie, jeśli wywołasz [1, 2, 3].map(&Person)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Klasa Singleton (eigenclass) w Ruby: co to jest i po co to potrzebne
29 paź 18:29

Klasa Singleton (eigenclass) w Ruby: co to jest i po co to potrzebne

Нотатки про 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
Zmienne w Ruby: @, @@ oraz zmienna instancji klasy
30 paź 20:54

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

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