From: "marcandre (Marc-Andre Lafortune)" Date: 2013-03-13T06:12:38+09:00 Subject: [ruby-core:53345] [ruby-trunk - Bug #8078][Rejected] Once nil is frozen, an unfrozen instance cannot be reached Issue #8078 has been updated by marcandre (Marc-Andre Lafortune). Status changed from Open to Rejected nil is an immediate. There are no multiple nils; nil.object_id is a constant. Same as true & false. Any code that checks for `frozen?` and then does a dup might have problems with any Ruby immediate. Note that fixnums & floats are frozen in Ruby 2.0.0. There is `duplicable?` in activesupport for that reason. ---------------------------------------- Bug #8078: Once nil is frozen, an unfrozen instance cannot be reached https://bugs.ruby-lang.org/issues/8078#change-37541 Author: mhuggins (Matt Huggins) Status: Rejected Priority: Normal Assignee: Category: core Target version: ruby -v: ruby 1.9.3p327 (2012-11-10) [i386-mingw32] =begin This is a rather peculiar bug I stumbled across. The basic issue is that once `nil` has been frozen, there is no way to access an unfrozen instance of nil. nil.frozen? => false nil.freeze nil.frozen? => true I say this is a peculiar bug because generally it doesn't matter if `nil` is frozen or not (since it is basically frozen even if not explicitly defined as such). However, since Ruby is based upon duck typing, you might run into a scenario like the following: def get(cache_key) content = Rails.cache.read(cache_key) content.frozen? ? content.dup : content end If I call the above method and the cache key exists, `content` is a frozen string, which I then `dup` to get an unfrozen copy. If I call the above method and the cache key does NOT exist, `content` is a frozen `nil`, which it then attempts to `dup` unsuccessfully since a NilClass instance cannot be duped. =end -- http://bugs.ruby-lang.org/