1

ドキュメントBignumから

私が見つけた以下のプロパティ:

Fixnum値は即時ですが、Bignumオブジェクトはそうではありません。割り当てとパラメーターの受け渡しは、オブジェクト自体ではなく、オブジェクトへの参照で機能します。」

実際、私が知る限り、実際のオブジェクトではなく、オブジェクトへの参照を渡しています。しかし、ここでは味についていけませんでした。

オブジェクトを含む計算がBignumに収まる結果を返す場合Fixnum、結果は自動的に変換されます。

Cで、自動変換などのルールがいくつか見つかりました。しかし、ここでも同じことが適用できますか、またはここで特別に Ruby 用に定義された他のルールはありますか?

bitwise「演算 およびの目的で、Bignum は、2 の補数表現を使用し[]た無限長であるかのように扱われます。」bitstring

なぜBignum、そうでないFixnumのか、それ以外なのか?

いくつかの小さなコード例を使用して、このトピックを詳細に理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

0

Fixnumは、すでにインスタンス化されている不変オブジェクトです。あなたはそれらを使用する必要があります。ドキュメントによると:

Fixnumオブジェクトには即時の価値があります。つまり、パラメータとして割り当てられたり渡されたりすると、そのオブジェクトへの参照ではなく、実際のオブジェクトが渡されます。割り当てはFixnumオブジェクトをエイリアスしません。任意の整数値に対して事実上1つのFixnumオブジェクトインスタンスしかないため、たとえば、Fixnumにシングルトンメソッドを追加することはできません。

一方、Bignumは通常のオブジェクトです。それらをインスタンス化する必要があり、それらの参照を使用して作業します。

つまり、x = 5を実行しているとき、オブジェクトはすでに作成されています。falseや0、1、2、...などのプリミティブのobject_idを確認できます。すべて異なりますが、常に同じです。

> 1.object_id
 => 3
> x = 1
 => 1
> x.object_id
 => 3

そのトピックに関する2つの良い記事:

Fixnumへの変換では、結果がFixnumの対象となるドメインにあることが検出されたときに、明示的な変換がトリガーされます。たとえば、サブ2のintの場合、値を返すときに、必要に応じてその変換を行うメソッドbignormを呼び出します(上記のコメントを参照) 。

> a = 10000000000
 => 10000000000 
> a.class
 => Bignum 
> b = a / 10
 => 1000000000 
> b.class
 => Fixnum 

最後の質問では、2の補数表現にリンクされています。Python用の記事やビット演算に関するウィキペディアのページなど、これに関する記事がいくつかあります。実際、Fixnumの場合、ビット単位の演算はプロセッサによって直接操作され、同じように動作します。

于 2013-03-07T10:55:01.327 に答える