From: "matz (Yukihiro Matsumoto)" Date: 2012-10-27T08:38:58+09:00 Subject: [ruby-dev:46288] [ruby-trunk - Feature #6936] Forbid singleton class and instance variabls for float Issue #6936 has been updated by matz (Yukihiro Matsumoto). Assignee changed from matz (Yukihiro Matsumoto) to ko1 (Koichi Sasada) OK, I'd like to see if everything goes well. Merge it. Matz. ---------------------------------------- Feature #6936: Forbid singleton class and instance variabls for float https://bugs.ruby-lang.org/issues/6936#change-31722 Author: naruse (Yui NARUSE) Status: Assigned Priority: Normal Assignee: ko1 (Koichi Sasada) Category: core Target version: 2.0.0 [Feature #6763] などで議論されていた flonum が r36798 でが入ったわけですが、 1. Float のオブジェクトID の仕様が変更 2. flonum な float に特異メソッドが追加不可 3. flonum な float に特異クラスが作成不可 4. flonum な float は同じ値同士でインスタンス変数が共有される といった非互換が存在します。 もっとも、1. は通常意識するはずのないところですし、2. は元から禁止されています。 気になるのは 3. と 4. で、これは 1.9.3 と挙動が異なるだけでなく、 32bit 環境での 2.0 や、64bit環境の flonum でない float オブジェクトとも挙動が異なります。 実際問題として実害はないような気もしますが、このような違いが極めて実装上の問題で、 Ruby 上から見えないところに存在するのは気持ち悪く感じます。 よって、以下のようにするとよいのではないでしょうか。 * flonum でない float でも特異クラスの作成を禁止 * float へのインスタンス変数作成を禁止 後者の具体的手法はいくつかあると思いますが、即値は最初から frozen にしておくとかもありかなと思っています。 話を発散させると、この話は true, false, nil, Fixnum, Symbol のような即値から、 Bignum や Time のような immutable っぽいオブジェクトにも当てはまる気がしています。 -- http://bugs.ruby-lang.org/