From: Yusuke ENDOH Date: 2010-01-29T08:39:56+09:00 Subject: [ruby-dev:40232] Re: [Bug:trunk] rubyspec: SimpleDelegator when frozen creates a frozen clone ERROR 遠藤です。 2010年1月29日1:49 Yukihiro Matsumoto : > ||lib/delegator.rb の clone の定義を見ると > || > || def clone > || new = super > || new.__setobj__(__getobj__.clone) > || new > || end > || > ||となっていて、__setobj__ するときにはもう SimpleDelegetor は freeze > ||状態なのでそりゃそうだという感じなんですが、どう直したものでしょう。 > | > |困りましたねえ。ちょっと考えてみます。 > > そういえば、こんな時のためにinitialize_copyというメソッドを用 > 意しておいたのでした。でも、今度はcloneとdupの区別がつかない > (API設計ミス)。もし、これによって非互換性が問題になるようなら > 教えてください。 (いい加減に試したところ) rubyspec と test-all ともにパスしたのですが、 以下のようなコードが動かなくなりました。 $ ./ruby -rdelegate -e ' a = [42, :hello].freeze d = SimpleDelegator.new(a) d.dup[0] += 1 ' -e:4:in `
': can't modify frozen array (RuntimeError) -- Yusuke ENDOH