метод `to_i` с базовым значением в качестве параметра в ruby

#ruby

#ruby

Вопрос:

Кто-нибудь может объяснить, как работает базовый параметр при вызове to_i на следующих примерах?

 '2'.to_i(2) #=> 0
'3'.to_i(2) #=> 0
'12'.to_i(2) #=> 1
'122'.to_i(2) #=> 1
'20'.to_i(2) #=> 0
'21'.to_i(2) #=> 0
  

Я не понимаю, как это на самом деле работает. Кто-нибудь может объяснить, пожалуйста?

Комментарии:

1. "2".to_i #=> 2 , 2.to_s(2) #=> "10" , "10".to_i(2) #=> 2 ; 2.to_s #=> "2" .

2. это тот случай, когда вы должны использовать Integer(x, 2) вместо x.to_i(2) . Последний никогда не выдаст ошибку, но он также, вероятно, делает не то, что вы хотите.

Ответ №1:

По той же причине, что и '54thousand'.to_i is 54 : to_i считывает до тех пор, пока не найдет конец строки или недопустимую цифру.

В двоичном формате (база 2) единственными допустимыми цифрами являются 0 и 1 . Таким образом, поскольку 2 недопустимо, '122'.to_i(2) идентично '1'.to_i(2) . Кроме того, '2'.to_i(2) идентичен ''.to_i(2) методу, что довольно интуитивно 0 .

Комментарии:

1. Это поведение описано в String#to_i документах API. @2017kamb Всегда полезно прочитать документы API, если вас смущает поведение метода.

2. И наоборот, '54thousand'.to_i(36) возвращает 521,395,291,927,273, потому что он фактически интерпретирует все символы как базовые 36 цифр.

Ответ №2:

base другими словами, Radix означает количество уникальных цифр в системе счисления.

В десятичной системе счисления у нас есть 0 to 9 , 10 цифр для представления чисел.
Вы используете 2 в качестве параметра, что означает двоичный код, поэтому работают только 0 и 1 .

Из документа to_i:

Возвращает результат интерпретации начальных символов в str как целочисленное базовое значение (от 2 до 36). Посторонние символы после конца допустимого числа игнорируются. Если в начале не указано допустимое число str , 0 возвращается. Этот метод никогда не создает исключение, когда база допустима.

Вы можете использовать эти числовые представления непосредственно в Ruby:

 num_hex = 0x100
#=> 256
num_bin = 0b100
#=> 4
num_oct = 0o100
#=> 64
num_dec = 0d100
#=> 100