2017-11-07 9 views
3

.classで数値を入力すると、Rubyチュートリアルでは、BignumまたはFixnumのいずれかを返します。12345.classが 'Integer'を返すRubyで 'Fixnum'でない

私はこれを行うと、私が代わりにIntegerを得る:

12345.class 
#=> Integer 

私はMac上でコマンドラインでIRBを使用しています。なぜ上記はチュートリアルのようにFixnumを返さないのですか?

答えて

7

Rubyのバージョンによって異なります。 Rubyの2.4.0から、我々はちょうどInteger秒、これ以上Fixnum sおよびBignumの区別

https://www.ruby-lang.org/en/news/2016/12/25/ruby-2-4-0-released/

+3

また、Ruby 2.4以前では、FixnumクラスとBignumクラスの両方が** Integerクラスから継承されていたことにも注意してください。だから、コード: '12345.is_a?(Integer)'はすべてのルビーバージョンで常に 'true'を返します。 –

+0

うん、うれしいよ:) – Ursus

+0

...また、Ruby 2.4では(ほとんどの)後方互換性を維持するために、 'Fixnum == Bignum == Integer'に注意してください。私。 '12345.is_a?(Fixnum)#=> true'。しかし、次のような警告も表示されます:* "警告:constant :: Fixnumは推奨されていません" *。 'Fixnum' /' Bignum'への参照はすべて将来のRuby版で完全に削除されるので、コードからすべての参照を削除する必要があります。 –

1

あなたはより良いチュートリアルを取得する必要があります。

ルビーは、Integerという名前のクラスが存在することを保証します。それはそれがが存在し、その後、Integer完全に抽象的でなければならないが、それはそれらの実装に固有のサブクラスを強制するものではありません義務かの実装固有のサブクラスそのInteger実装固有のサブクラスを可能にし、存在する。

I言い換える:

  • Integerは常に存在します。
  • 実装固有のサブクラスIntegerが存在する場合と存在しない場合があります。
  • これらの実装固有のサブクラスは、BignumFixnumという名前でも、そうでないかもしれません。

使用しているチュートリアルは、間違っている(または少なくとも古いものです)。これは、少なくとも2009年のISO Ruby言語仕様の最初の草稿以来正式に文書化されていますが、それ以前でさえもそうでした。

関連する問題