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

Dlaczego pusty ciąg (string) w Ruby nie jest fałszem?

Okładka posta: Dlaczego pusty ciąg (string) w Ruby nie jest fałszem?
Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Pusty ciąg w Ruby nie jest false. Programiści lubią porównywać ten szczegół z Perlem, ponieważ w Perlu pusty ciąg jest false.
Trzeba zapamiętać, że w Ruby wartości false to tylko nil i false.
W Ruby wyrażenia warunkowe są obliczane na podstawie logicznej prawdziwości (truthiness) lub fałszywości (falsiness) wartości. Spośród wszystkich możliwych wartości w Ruby tylko dwie są fałszywe: nil i false. Wszystkie inne wartości, w tym pusty ciąg (""), są uważane za prawdziwe (true).
Oznacza to, że przy użyciu pustego ciągu w wyrażeniu warunkowym zawsze będzie on traktowany jako true. Aby sprawdzić, czy ciąg jest pusty, można użyć kilku podejść:

Metoda empty?

str = ""
puts "Pusty ciąg" if str.empty?

Pusty ciąg
=> nil
Widzimy, że str.empty? zwróciło true i wydrukowało odpowiedź. Następnie widzimy nil, ale dlaczego - przeczytaj więcej w tym wpisie.
Ruby ma wbudowane metody, które pozwalają pokazać, czy ciąg jest pusty. I to właśnie te metody należy używać w wyrażeniach warunkowych, aby kod był maksymalnie zrozumiały.

Porównanie z pustym ciągiem

str = ""
puts "Pusty ciąg" if str == ""
Pusty ciąg
=> nil
Ruby to fajny język i pozwala robić te same rzeczy na różne sposoby. Więc jeśli chcesz, możesz używać porównania z pustym ciągiem w wyrażeniach warunkowych.
Sprawdzamy długość ciągu (string)
str = ""
puts "Pusty ciąg" if str.size == 0
# lub 
puts "Pusty ciąg" if str.length == 0
Jak już pisałem - ruby pozwala robić te same rzeczy na różne sposoby (zwróć uwagę na metody size i length).

Dlaczego pusty ciąg zwraca true?

Może to wydawać się nielogiczne, ponieważ '' to coś, co bardziej przypomina nic / pustkę. Ale przyjrzyjmy się temu trochę bliżej.
W Ruby łatwiej jest traktować wszystkie obiekty, z wyjątkiem nil i false, jako prawdziwe. To zmniejsza liczbę specyficznych przypadków, które programista musi zapamiętać. Ruby opiera się na zasadzie, że wszystko jest obiektem. Oznacza to, że każda wartość, w tym pusty ciąg, musi być obiektem i mieć określone zachowanie. Ponieważ pusty ciąg jest obiektem klasy String, jest traktowany jako prawdziwy. Uznając pusty ciąg za prawdziwy, Ruby upraszcza wyrażenia warunkowe i sprawia, że kod jest bardziej przewidywalny. Na przykład, w wyrażeniach warunkowych można zawsze polegać na tym, że tylko nil i false będą traktowane jako fałszywe.
str = ""
if str
  puts "Ciąg nie jest nil ani false"
else
  puts "Ciąg jest nil lub false"
end
Przy okazji, udowodnijmy, że obiekt klasy String (a konkretnie pusty ciąg) nie jest immediate value. Pusty ciąg (jak każdy obiekt klasy String) nie jest immediate value, a reprezentuje się jako obiekt w pamięci. W Ruby tylko nil i false są false w wyrażeniach warunkowych. Wszystkie inne wartości, w tym pusty ciąg, są uważane za prawdziwe (truthy).
str1 = ""
str2 = ""
puts str1.object_id == str2.object_id

=> false # To znaczy, że każdy ciąg ma swój object_id 

str1.object_id
=> 46820

str2.object_id
=> 46800
To znaczy, że mamy dwa różne obiekty String z pustą zawartością. I obiekt zwraca true w wyrażeniach warunkowych.

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

Do czego potrzebna jest baza danych CVE (Wspólne Luki i Ekspozycje)?
29 maj 08:05

Do czego potrzebna jest baza danych CVE (Wspólne Luki i Ekspozycje)?

meme code
meme code@memecode
29 maj 09:09

Jakie systemy operacyjne wspierają Ruby?

meme code
meme code@memecode
Czy Ruby tworzy nową kopię obiektu podczas przypisywania zmiennej do zmiennej?
29 maj 09:30

Czy Ruby tworzy nową kopię obiektu podczas przypisywania zmiennej do zmiennej?

meme code
meme code@memecode
Jaka jest różnica między wartością bezpośrednią a referencją w Ruby?
29 maj 12:00

Jaka jest różnica między wartością bezpośrednią a referencją w Ruby?

meme code
meme code@memecode
Dlaczego kod Ruby zwraca nil po wykonaniu puts?
29 maj 20:30

Dlaczego kod Ruby zwraca nil po wykonaniu puts?

meme code
meme code@memecode
Jaka jest różnica między nil a false w Ruby?
29 maj 20:59

Jaka jest różnica między nil a false w Ruby?

meme code
meme code@memecode
Zakres widoczności zmiennej lokalnej w Ruby
3 cze 16:46

Zakres widoczności zmiennej lokalnej w Ruby

meme code
meme code@memecode
Czym różni się int od bigint w Ruby? Minimalne i maksymalne wartości.
13 cze 06:37

Czym różni się int od bigint w Ruby? Minimalne i maksymalne wartości.

meme code
meme code@memecode
Co oznacza błąd 'is out of range' w Ruby on Rails? Błąd zakresu - Liczba całkowita z limitem 4 bajtów
13 cze 07:18

Co oznacza błąd 'is out of range' w Ruby on Rails? Błąd zakresu - Liczba całkowita z limitem 4 bajtów

meme code
meme code@memecode
Czym jest niemutowalność i mutowalność?
19 cze 07:48

Czym jest niemutowalność i mutowalność?

meme code
meme code@memecode
[Ruby] Co zwróci wynik dodawania 10.5 i 10?
23 cze 13:23

[Ruby] Co zwróci wynik dodawania 10.5 i 10?

meme code
meme code@memecode
[Ruby] Czym różnią się zmienne zaczynające się od @, @@ i $?
23 cze 14:00

[Ruby] Czym różnią się zmienne zaczynające się od @, @@ i $?

meme code
meme code@memecode