У меня есть следующий код:Невозможно изменить замороженную Fixnum на Ruby, 2.0
require 'prime'
class Numeric
#... math helpers
def divisors
return [self] if self == 1
@divisors ||= prime_division.map do |n,p|
(0..p).map { |i| n**i }
end.inject([1]) do |a,f|
a.product(f)
end.map { |f| f.flatten.reduce(:*) } - [self]
end
def divisors_sum
@divisors_sum ||= divisors.reduce(:+)
end
#... more methods that evaluate code and 'caches' and assigns (||=) to instance variables
end
Wich выдает ошибку с:
> 4.divisors
/home/cygnus/Projects/project-euler/stuff/numbers.rb:24:in `divisors_sum': can't modify frozen Fixnum (RuntimeError)
, когда я удаляю кэширование в переменных экземпляра ошибка исчезает @divisors
, @divisors_sum
... и т. Д. И это происходит только на ruby 2.0. Исправлено на 1.9.3 без проблем. Что случилось?
Подтверждено код работает нормально на 1.9 .3 Также подтверждено, что не работает в 2.0.0 для меня. Добавление переменной экземпляра в Fixnum довольно необычно. –
Пытался ускорить работу. Некоторые методы могут занимать пару секунд, и все это снова и снова повторяется для большого набора чисел, что увеличивает время выполнения. – nicooga
'prime' - это драгоценный камень? какой оператор находится в строке 24? –