[ruby-list:50331] Re: 1 は Integer のインスタンスですか
From:
"Shota Fukumori (sora_h)" <sorah@...>
Date:
2016-05-17 20:53:39 UTC
List:
ruby-list #50331
だいたい似た認識ですね。 個人的には is_a? より kind_of? の方が「サブクラスを含む」意味合いが分かりやすいのでそっちを使うことが多いかなあ。 rdoc では kind_of? で instance って単語はでてきませんね。instance_of? の方には出てきているけれど、 class of object という書き方に統一してもいいのかもしれないなあ…。 http://docs.ruby-lang.org/en/2.3.0/Object.html#method-i-kind_of-3F http://docs.ruby-lang.org/en/2.3.0/Object.html#method-i-instance_of-3F 以下余談: 全然関係ないすごくタイムリーな話なんですが、trunk (2.4.0dev) では Integer に統一する変更が取り入れられました (つい昨日の話)。 https://bugs.ruby-lang.org/issues/12005#note-9 (まだリリースまで時間があるため、問題が見つからないかどうか入れてみた、という風にみています。問題あれば revert されるかも。) なので、 >> RUBY_DESCRIPTION => "ruby 2.4.0dev (2016-05-18 trunk 55039) [x86_64-linux]" >> Integer => Integer >> [1.class, (1<<64).class] => [Integer, Integer] >> [1.instance_of?(Integer), (1<<64).instance_of?(Integer)] => [true, true] となります。 互換性の観点から、Fixnum, Bignum は Integer と同値になっています。 >> Fixnum => Integer >> Bignum => Integer On Wed, May 18, 2016 at 2:07 AM H.Hiro <main@hhiro.net> wrote: > H.Hiroです。 > > この場合、FixNumがIntegerのサブクラスということになります。 > > 私としては、 inst.is_a?(Integer) > > は「instがIntegerのインスタンスそのものではないが、Integerが持つべき機能は持ち合わせている」、inst.instance_of?(Integer)は「instを実際に作り上げたクラスはIntegerである」、という認識をしています。 > 「整数を表すインスタンスであるか」(Fixnum, Bignum問わず)であれば inst.is_a?(Integer) > とすればよい、というところでしょうか。 > > ちなみに、 http://docs.ruby-lang.org/ja/2.2.0/class/Integer.html > > にもありますが、Integerは抽象クラス(それ自身からはインスタンスが生成されず、継承された先からのみ生成される)であるので、いかなるRubyのオブジェクトについても > inst.instance_of?(Integer) が真になることはないはずです(たぶん)。 > > 2016年5月16日 8:10 5.5 <5.5@moji.gr.jp>: > > 5.5 です。 > > (既出だったかどうか覚えがないのですが) > > > > 1 って Integer のインスタンスなんでしょうか? > > > > お尋ねしたいのは Ruby の動作や仕様ではなく単なる用語の問題です。 > > Ruby では「インスタンス」をどういう意味で使っているかという。 > > > > instance_of? の動作は以下のようになっています。 > > > > 1.instance_of?(Fixnum) #=> true > > 1.instance_of?(Integer) #=> false > > > > メソッド名からすると,1 は Integer のインスタンスと呼ばないよ > > うに思えます。 > > > > しかしリファレンスマニュアルの Object#instance_of? のページ > > http://docs.ruby-lang.org/ja/2.3.0/method/Object/i/instance_of=3f.html > > には, > > > > オブジェクトがクラス klass の直接のインスタンスである時 > > 真を返します。 > > > > と書かれています。 > > 「直接の」という表現が使われているので,当然「直接ではない」場 > > 合があると想定されます。 > > このことから > > 「1 は,直接にではないが,Integer のインスタンスである」と言え > > るのだろう,と思いました。 > > > > ところが,「Object#is_a?」のページ > > http://docs.ruby-lang.org/ja/2.3.0/method/Object/i/kind_of=3f.html > > を見ると, > > > > オブジェクトが指定されたクラス mod かそのサブクラスのイン > > スタンスであるとき真を返します。 > > > > とあります。 > > この表現からは,「1 は Integer のサブクラスのインスタンスでは > > あるが,Integer のインスタンスではない」のだろうと推察されます。 > > > > どっちなんでしょうか。 > > > > クラスの継承関係を分類理論などの「カテゴリー」の類比で捉えると, > > 直接だろうが間接だろうがインスタンスであると呼ぶほうが自然な気 > > がするのですが。 > > > > > > ちなみに「Ruby 用語集」 > > http://docs.ruby-lang.org/ja/2.3.0/doc/glossary.html > > の「インスタンス」を見ると, > > > > オブジェクトのこと。オブジェクトがあるクラスに所属するこ > > とを強調する意味あいがあるらしい。オブジェクトなんだかイ > > ンスタンスなんだか混乱してオブジェクト指向に挫折する人は > > 多いと聞く。 > > > > となっていて,解決になりませんでした。 > > > > -- > > 5.5@moji.gr.jp > > > > -- > H.Hiro / Maraigue > http://hhiro.net/about/ > main@hhiro.net >