Почему Ruby String#to_i иногда возвращает 0, когда строка содержит число?

Я просто пробовал Ruby и наткнулся на String#to_i. Предположим, у меня есть этот код:

var1 = '6 sldasdhkjas'
var2 = 'aljdfldjlfjldsfjl 6'

Почему puts var1.to_i выводит 6, когда puts var2.to_i дает 0?


person hsinxh    schedule 07.01.2012    source источник


Ответы (3)


Метод to_i возвращает число, состоящее из всех поддающихся анализу цифр в начале строки. Ваша первая строка начинается с цифры, поэтому to_i возвращает это, вторая строка не начинается с цифры, поэтому возвращается 0. Кстати, пробел игнорируется, поэтому " 123abc".to_i возвращает 123.

person DarkDust    schedule 07.01.2012
comment
Значит, если в начале строки есть нецелочисленный символ, to_i проигнорирует остальную часть строки? - person hsinxh; 07.01.2012
comment
Именно, если строка начинается с нецелого символа, она немедленно прекращает синтаксический анализ и возвращает 0, игнорируя любые числа, которые могут появиться в строке позже. - person DarkDust; 07.01.2012
comment
Это не совсем так — он будет анализировать пробельные символы. 123.to_i будет оцениваться как 123, как и строка, начинающаяся с табуляции. - person Marc Talbot; 07.01.2012

Из документации для String#to_i:

Возвращает результат интерпретации начальных символов в строке str как целое число.

person Gareth    schedule 07.01.2012

Более исчерпывающие примеры to_i:

irb(main):013:0* "a".to_i
=> 0
irb(main):014:0> "".to_i
=> 0
irb(main):015:0> nil.to_i
=> 0
irb(main):016:0> "2014".to_i
=> 2014
irb(main):017:0> "abc2014".to_i
=> 0
irb(main):018:0> "2014abc".to_i
=> 2014
irb(main):019:0> " 2014abc".to_i
=> 2014
person png    schedule 27.03.2014