4

次のコードがあります。

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

次のエラーを出力します。

> 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 で問題なく実行できました。何が起こっていますか?

4

3 に答える 3

4

@tadman の回答に加えて、動作する理由と動作し1.9.3ない理由は、2 年前にthisおよびthis2.0.0で証明されているように、Fixnums (および Bignums) をフリーズする決定が下されたためです。

于 2013-04-05T18:42:50.057 に答える