Jaki jest cel operatora znaku zapytania w Ruby?
Czasami wygląda to tak:
assert !product.valid?
czasami jest w ifkonstrukcji.
Jaki jest cel operatora znaku zapytania w Ruby?
Czasami wygląda to tak:
assert !product.valid?
czasami jest w ifkonstrukcji.
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 testw 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.
iscał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 ?Fzwróci ciąg "F", więc aby skrócić kod, możesz również użyć ?F.ordRuby 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, ?dto skrót do "d". testprzyjmuje jako pierwszy argument ciąg jednoznakowy, aby można go było wywołać za pomocą test ?d, "/dev"lub test "d", "/dev".