2017-10-31 14 views
2

すべての整数値(オブジェクト)にシングルトンメソッドを定義します。シングルトンメソッドを適用している間にエラーが発生しています。Ruby:なぜfixnumクラスでsinglteonメソッドを定義できないのですか?

RubyDocとはThere is effectively only one Fixnum object instance for any given integer valueです。これは何を意味するのでしょうか ??どのように他の通常のクラスとは異なりますか?私はこの行を解釈することができません。

+2

コードコード、コードを参照してください。 –

+0

どのようなエラーが表示されますか? –

答えて

2

これは、数字1などのいくつかのFixnumにアクセスするたびに、常に同じ "インスタンス"を扱うことを意味します。これは、ルビーが数値を最適化するために使用する実装の詳細です。

2

Integerクラスは、デフォルトで凍結されている:

1.frozen? 
=> true 

があるだけで、これまでの任意の整数オブジェクトのインスタンスを1つ存在します。これを可能にするために特別なことを行う必要はありません。つまり、適用しようとしている最適化はRubyに組み込まれています。

3
私はすべての整数値(オブジェクト)に特異メソッドを定義したい

これは矛盾しています。シングルトンクラスは、単一のオブジェクトに何かを適用する場合に使用します。 のオブジェクトをすべて整数オブジェクトとして定義したいので、シングルトンクラスは適切なツールではありません。ちょうどあなたが3のシングルトンクラスを変更することができれば、その数だけ3と無他の番号に適用されるいくつかの行動があるだろう

class Integer 
    def foobar 
    "hey" 
    end 
end 

3.foobar 
# "hey" 

通常のクラスを使用します。それを防ぐ技術的な理由はありませんが、あなたができないことは良いことだと私を信じています。

が効果的にこれは何か他のものについて話している任意の整数値

1件のだけFixnumかのオブジェクトのインスタンスがあります。差異に注意してください。

x = [] 
y = [] 
x == y      # true 
x.object_id == y.object_id # false! 

x = 3 
y = 3 
x == y      # true 
x.object_id == y.object_id # true! 
x.object_id == 5.object_id # false 

他のほとんどのオブジェクトとは異なり、同等のフィックスナムは同じオブジェクトです。 3と5はFixnumの2つの異なるインスタンスですが、Fixnumの2つの異なるインスタンスが両方とも3であることは不可能です。それぞれの3つは同じです。これは技術的な必要性ではなく、ほとんどのプログラマーが数値データをどのように考えるかの利便性を高めるものです。

+1

** Fixnum(MRIで)は、C言語の整数として表され、他のすべてのオブジェクトと同様に構造体ではないので、**シングルトンクラスを持つことはできません。これはもちろん実装の詳細なものであり、small intsの処理速度は向上しましたが、最終的にはすべてのint(Integrクラスで統一されているFixnumとBignum)でそのまま使用することに決めました。 – YoTengoUnLCD

+0

真実ですが、私の主張はそのようには必要ではないということです。内部的な矛盾がなくても、言語は異なる方法で定義/実装されている可能性があります。私は、この決定は、あなたが指摘しているように、他のOO言語と一層合致し、効率化されると考えています。 – Max

関連する問題