Jaki jest cel operatora znaku zapytania w Ruby?
Czasami wygląda to tak:
assert !product.valid?
czasami jest w if
konstrukcji.
Jaki jest cel operatora znaku zapytania w Ruby?
Czasami wygląda to tak:
assert !product.valid?
czasami jest w if
konstrukcji.
Odpowiedzi:
Jest to konwencja stylu kodu; wskazuje, że metoda zwraca wartość logiczną.
Znak zapytania jest prawidłowym znakiem na końcu nazwy metody.
?
w języku Ruby (jest operatorem potrójnym, przekształcającym znak na jego liczbę całkowitą ASCII, użycie test
w wyrażeniach RegEx, itp.), Z których wiele omówiono w innych odpowiedziach tutaj.
isEmpty()
, isDigit()
itp W Ruby, te same metody byłoby napisane empty?
, i digit?
który jest trochę ładniejszy IMO.
is
cały czas. To może być bardzo mylące dla kogoś pochodzącego z Swift od znaku zapytania nie jest wykorzystywany do nullable
:)
Uwaga: ?
wraz ze znakiem zwróci kod znaku ASCII dlaA
Na przykład:
?F # => will return 70
Alternatywnie w Ruby 1.8 możesz:
"F"[0]
lub w ruby 1.9:
"F".ord
Zauważ też, że ?F
zwróci ciąg "F"
, więc aby skrócić kod, możesz również użyć ?F.ord
Ruby 1.9, aby uzyskać ten sam wynik jak "F".ord
.
'F'
W twoim przykładzie jest to tylko część nazwy metody. W Ruby możesz także używać wykrzykników w nazwach metod!
Innym przykładem znaków zapytania w Ruby byłby trójskładnikowy operator.
customerName == "Fred" ? "Hello Fred" : "Who are you?"
W twoim przykładzie
product.valid?
W rzeczywistości jest wywołaniem funkcji i wywołuje funkcję o nazwie valid?
. Niektóre typy funkcji „test warunku” / logicznej mają znak zapytania jako część nazwy funkcji zgodnie z konwencją.
Warto zauważyć, że ?
są dozwolone tylko w nazwach metod, a nie w zmiennych. W procesie uczenia się języka Ruby założyłem, że ?
wyznaczyłem boolowski typ zwrotu, więc spróbowałem dodać je do zmiennych flag, co prowadzi do błędów. Doprowadziło mnie to do błędnego uwierzenia przez jakiś czas, że istnieje specjalna składnia dotycząca ?
s.
Istotne: Dlaczego nazwa zmiennej nie może kończyć się na `?`, Podczas gdy nazwa metody może?
Wierzę, że to tylko konwencja dla rzeczy, które są logiczne. Trochę jak powiedzenie „ IsValid
”.
Jest również używany w wyrażeniach regularnych, co oznacza „co najwyżej jedno powtórzenie poprzedniego znaku”
na przykład wyrażenie regularne /hey?/
pasuje do ciągów „ he
” i „ hey
”.
Jest to również powszechna konwencja używana z pierwszym argumentem metody testowej z jądra # test
irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true
jak widać w tym pytaniu tutaj
test
, ?d
to skrót do "d"
. test
przyjmuje jako pierwszy argument ciąg jednoznakowy, aby można go było wywołać za pomocą test ?d, "/dev"
lub test "d", "/dev"
.