конвертация чисел - Fixnum/Bignum

Я думал, Ruby автоматически конвертируется в Bignum. Я нашел подтверждение здесь

Однако этого не происходит:

ruby 1.8.7 (358) [universal-darwin12.0]
>> 2 ** 62    
=> 4611686018427387904
>> 2 ** 63
=> -9223372036854775808   #why minus - how about automatic Bignum conversion?
>> 2 ** 64
=> 0                      #- how about automatic Bignum conversion?                       

person Adam    schedule 24.02.2013    source источник
comment
На ruby 1.8.7 (2012-10-12 patchlevel 371) [i686-darwin12.2.0] у меня конвертация работает нормально. 2**13355 тоже пробовал ;-)   -  person Prakash Murthy    schedule 24.02.2013
comment
Срок службы Ruby 1.8.7 будет прекращен менее чем через 3 месяца (июнь 2013 г.). Прекратите использовать его и обновите до 1.9.   -  person Andrew Marshall    schedule 24.02.2013


Ответы (3)


Используйте более новую версию Ruby

Ruby 1.8.7 (в терминах Интернета) древний. Используйте что-то более свежее. Например:

[1] pry(main)> RUBY_VERSION
=> "2.0.0"
[2] pry(main)> 2 ** 63
=> 9223372036854775808
[3] pry(main)> 2 ** 64
=> 18446744073709551616
person Todd A. Jacobs    schedule 24.02.2013
comment
Ruby 2.0 уже выпущен? Я постоянно проверял веб-сайт каждый час сегодня, и до сих пор не могу найти обновление. - person sawa; 24.02.2013
comment
@sawa Нет, это не так, но RC сообщает о себе как 2.0.0. - person Andrew Marshall; 24.02.2013
comment
Наконец, он выпущен: Ruby 2.0.0-p0. - person sawa; 24.02.2013

Вероятно, это ошибка старой версии Ruby. Перешел на более новую версию, проблема исчезла. Сегодня день выпуска Ruby 2.0. Ruby 1.8 скоро умрет. На моем Ruby 1.9.3 я просто сделал 2**1000000 без каких-либо проблем, за исключением того, что это продолжается какое-то время, поэтому мне пришлось его прервать.

person sawa    schedule 24.02.2013

Скорее всего, это ошибка конкретной сборки, которую вы используете. Например, когда я делаю ruby -v, я получаю:

ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin12.2.1], MBARI 0x6770, Ruby Enterprise Edition 2011.03

... и в сеансе irb я получаю:

1.8.7 :006 > 2 ** 64
 => 18446744073709551616 
1.8.7 :007 > (2 ** 64).class
 => Bignum 
1.8.7 :008 > RUBY_VERSION
 => "1.8.7" 

У меня также не возникает этой проблемы, если я использую более новые версии. Если вы можете опубликовать свой вывод из ruby -v, это прольет свет на ситуацию. Например, Ruby REE против MRI против JRuby и т. д.

Кроме того, и это всего лишь мнение, так что примите его за то, что оно того стоит, но я не думаю, что Apple очень хорошо поддерживает обновление своей встроенной версии Ruby, так что на случай, если вы используете встроенную версию затем подумайте о переходе на другую сборку.

person jefflunt    schedule 24.02.2013