Co jest nauką kryjącą się za tym, że metoda to_i w instancjach Rubin's NilClass zwraca zero? Wracając zero lub zgłaszanie wyjątku nie byłoby bardziej logiczne?Rubinowy zer i zero
Odpowiedz
NilClass
definiuje #to_i
z tego samego powodu, że definiuje #to_a
która zwraca [].
To daje coś odpowiedniego typu, ale pustym rodzaju wartości.
Jest to całkiem przydatne. Na przykład:
<%= big.long.expr.nil? ? "" : big.long.expr %>
staje:
<%= big.long.expr %>
wiele ładniejszy! (Erb dzwoni #to_s które na zero, to ""). A:
if how.now.brown.cow && how.now.brown.cow[0]
how.now.brown.cow[0]
else
0
end
staje:
how.now.brown.cow.to_a[0].to_i
Krótkie konwersje istnieć, gdy potrzebna jest tylko reprezentacją. Długie konwersje są tymi, które wywołują podstawowe metody Ruby i wymagają czegoś bardzo bliskiego. Użyj ich, jeśli chcesz sprawdzić typ.
Czyli:
thing.to_int # only works when almost Integer already. NilClass throws NoMethodError
thing.to_i # this works for anything that cares to define a conversion
* "O wiele ładniej!" Tak, to zależy od tego, jak dobrze ty i ktokolwiek pracujący przy projekcie znają Ruby i jak bardzo chcesz polegać na nieintuicyjnym zachowaniu. 'nil.to_i' zwracające 0 zamiast zgłaszania wyjątku nie logicznie logicznie. Jak uzyskać '0' z' nil'? To nie jest tak, że 'nil == 0' zwraca true, ale' to_i' oznacza równoważność. –
@Ed S .: Nie, 'to_int' sugeruje równoważność,' to_i' jest tak niedbałe, że naprawdę nie implikuje wiele z niczego. –
świetna odpowiedź! Zawsze przeoczyłem długie nawrócenia, teraz mogę je zrozumieć i jak pasuje do filozofii rubinu. –
Pasuje filozofię Ruby permisywizmu (w przeciwieństwie do, na przykład, surowość Pythonie):
nil.to_i #=> 0
"".to_i #=> 0
"123hello".to_i #=> 123
"hello".to_i #=> 0
Szczerze mówiąc, myślę, że to jest zbyt liberalne. Jak zauważył Zabba, możesz użyć wartości Kernel#Integer(string) dla ścisłej konwersji.
to_i
oznacza "przekonwertuj mnie na liczbę całkowitą, jeśli możesz".
Jeśli chcesz "jeśli jesteś bardzo podobny do liczb całkowitych, podaj mi wartość całkowitą, inaczej podaj NoMethodError", a następnie użyj .to_int
.
Jest jeszcze jedna kwestia, która pyta o różnicę między to_i
i to_int
, to_s
kontra to_str
itp Daj mi znać, jeśli chcesz mi znaleźć go dla Ciebie.
Protokół to_i
mówi, że musi zwrócić Integer
i nie musi podnieść wyjątek. Obie sugestie naruszają co najmniej jedną z tych zasad. Więc nie, te nie tylko nie byłyby bardziej logiczne, byłyby po prostu nieważne.
Należy jednak zauważyć, że nil
nie odpowiada na to_int
. Gdyby zareagował na , to byłby on rzeczywiście "nielogiczny".
Fakt, że protokół mówi, że 'to_i' musi zwracać liczbę całkowitą, nie czyni tego zachowania logicznym, po prostu czyni go zgodnym (biorąc pod uwagę, lepiej jest być zgodnym nawet, jeśli nielogicznym). –
Jeśli zdarzy ci się być w Rails można użyć try
:
nil.to_i # => 0
nil.try :to_i # => nil
- 1. Negatywne zer w Matlab
- 2. zero || false i false || zero w Ruby
- 3. Rubinowy odpowiednik PHP $ this
- 4. Guid to zero (wszystkie)?
- 5. Mongo - rubinowy problem z połączeniem
- 6. Konwersja ciąg zer binarnych i jedynek
- 7. SQL Server Pełny tekst nie bierze pod uwagę bezpośrednich zer na zero
- 8. Moduł Rubinowy Benchmark: znaczenia "użytkownik", "system" i "prawdziwy"?
- 9. 2d tablica zer
- 10. Lista zer w pytonie
- 11. Dodawanie zer wiodących w ciągu znaków
- 12. Zachowywanie zer końcowych
- 13. Równoważnik rubinowy biblioteki zapytań Pythona (klient HTTP)
- 14. Co to jest rubinowy odpowiednik python'a getattr
- 15. Jaki jest ekwiwalent Rubinowy os.walk Pythona?
- 16. włączyć hash rubinowy do listy html
- 17. Zachowywanie zer końcowych za pomocą plotowania
- 18. RVM instalacji rubinowy błąd na Arch Linux
- 19. Czy istnieje rubinowy odpowiednik opcji Scala?
- 20. cotygodniowy kod rubinowy w locie w emacs
- 21. Usuń wszystkie zer z tablicy
- 22. Jak złapać "nieokreśloną metodę" [] "dla zer: NilClass" błąd?
- 23. Drukowanie końcowych zer w QString
- 24. Nieokreślona metoda "zniszcz" dla zer: NilClass
- 25. Testowanie zakresów szyn dla zer
- 26. Traktowanie zero jako zero w sumie funkcji
- 27. Magento, getSubtotal i getGrandTotal zawsze zwracają zero
- 28. SQL Server Sprawdź IsNull i Zero
- 29. superview i parentviewcontroller zero po dodaniu subview
- 30. Naive Bayesian i zero-frequency issue
powiązanymi: Można użyć 'n = Integer (str)' jeśli chcesz podnieść wyjątek na niepowodzenie. – Dogbert