Mam następujący fragment kodu:
gets().to_i
Kiedy wprowadzam "A"
, "a"
, "world"
lub cokolwiek i przekonwertuj go na liczbę całkowitą za pomocą to_i
, Dostaję 0
zwrócony. Czy ktoś może wyjaśnić, co tu się dzieje i dlaczego widzę? 0
zawsze?
Odpowiedzi:
2 dla odpowiedzi № 1To dlatego, że łańcuch przekształcony na liczbę całkowitą zwraca 0
lub liczbę całkowitą, jeśli ciąg zaczyna się cyframi.
➜ ~ irb
2.1.5 :001 > "whatever".to_i
=> 0
2.1.5 :002 > "12-whatever".to_i
=> 12
2.1.5 :003 > "whatever-12".to_i
=> 0
Kiedy próbujesz się nawrócić A
, a
, world
do liczby całkowitej (co nie ma sensu), dostaniesz 0
.
Powinieneś sprawdzić, czy dane wejściowe są liczbą całkowitą, zanim spróbujesz rzucić je na liczbę całkowitą. Możesz użyć wyrażenia regularnego lub Integer
metoda, która zostanie podniesiona, jeśli wejście nie jest liczbą całkowitą.
2.1.5 :004 > Integer(12)
=> 12
2.1.5 :005 > Integer("world")
ArgumentError: invalid value for Integer(): "world"
from (irb):5:in `Integer"
from (irb):5
from /Users/weppos/.rvm/rubies/ruby-2.1.5/bin/irb:11:in `<main>"
2.1.5 :006 > Integer("12-world")
ArgumentError: invalid value for Integer(): "12-world"
from (irb):6:in `Integer"
from (irb):6
from /Users/weppos/.rvm/rubies/ruby-2.1.5/bin/irb:11:in `<main>"
1 dla odpowiedzi nr 2
The oficjalna dokumentacja na ten temat jest dobrze napisany.
0 dla odpowiedzi № 3
W rzeczywistości to, co opisujesz, nie może być powielane. We wszystkich przykładach, które dałeś, String#to_i
rzeczywiście wraca 0
, ale to nie znaczy, że powraca 0
dla dowolnego ciągu. Pierwszy, to_i
widzi, czy początek ciągu znaków można zinterpretować jako liczbę całkowitą. Jeśli tak, zwraca tę liczbę całkowitą. Jeśli nie, to zwraca 0
.