Project

General

Profile

Actions

Feature #6936

closed

Forbid singleton class and instance variabls for float

Added by naruse (Yui NARUSE) over 8 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
Target version:
[ruby-dev:46081]

Description

[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 っぽいオブジェクトにも当てはまる気がしています。


Related issues

Related to Backport187 - Backport #4578: Fixnum.freeze not frozen?ClosedActions
Related to Ruby master - Feature #6763: Introduce Flonum technique to speedup floating computation on th 64bit environmentClosedko1 (Koichi Sasada)07/21/2012Actions
Related to Ruby master - Feature #3222: Can bignums have singleton class & methods?Closedko1 (Koichi Sasada)04/30/2010Actions
Actions

Also available in: Atom PDF