Ruby オブジェクトに関して

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 908

cheeeeeeese

score 155

皆様、質問がございます。

 Rubyでは全てがオブジェクトですが、それはObjectクラス(スーパークラス)を継承しているためだと初めてのRubyで知りました、

ではインスタンスはどうなるのでしょうか??

よろしくお願い申し上げます。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

オブジェクト = インスタンスと捉え
という前提がチョッピリ違って、より厳密には
オブジェクト > インスタンス
ということだと思います。
#本当は不等号じゃなく集合の含むという記号を使いたかったのですが・・・

ザックリした言い方をすると、インスタンスとは、クラスというに具体的なプロパティ値(属性)を付与することで実体化されたオブジェクトのことで、オブジェクトの一つのタイプです。
この辺の事については、こちら の説明を読むと理解が深まると思います。

じゃあ、インスタンスじゃ無いかオブジェクトって?と思われたのであれば、javascriptに関する こちら の説明もついでにお読みください。
そうすると、Rubyではほぼすべてがオブジェクトであると言われている理由が納得出来ると思います。

しかしながら、決して全てがオブジェクトではない!っていう こちら の説明を読むと、更に理解が深まると思います。

少しでもご参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/29 16:42

    多くの参照URLをありがとうございます。

    理解が深まりました!!

    キャンセル

0

ダックタイピングもあって、厳密なオブジェクトの型を考える場面はRubyでは少ないですが、ObjectのサブクラスのインスタンスもObjectのインスタンスとして使えます。

p nil.is_a?(Object) # => true

ただし、Rubyではサブクラス側で親クラスのメソッドをundefできますので、親ウラスと互換でないものも作れてしまいます。

………こんな回答でよろしかったでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/28 10:10

    ご回答ありがとうございます。
    質問の仕方がよろしくなかったと現在感じています、申しわけ有りませんでした。
    追加の質問をお願いします。

    はじめてのRubyでは、「Rubyのなかではすべてがオブジェクトであり、数値も文字列も正規表現もクラスそのものもオブジェクトである」と定義しています。

    この時、オブジェクト=インスタンスと捉え、言及したほうがより厳密な表現ではないのか??というのが私の質問の意図でした。

    広義の意味合いにおいて、Rubyのすべての情報(リソース)は"object"なのはわかります。
    ただインスタンスという意味合いとオブジェクトという意味合いの区別がうまくできていないため、その違いをお教えいただければと思います。

    キャンセル

  • 2015/08/28 11:02

    「Rubyのなかではすべてがオブジェクトであり、数値も文字列も正規表現もクラスそのものもオブジェクトである」という文ですが、この中での「オブジェクト」は、「Objectクラスのインスタンス」という狭義の意味ではなくて、「オブジェクト指向で扱う『もの』」という抽象的な意味合いのものです。つまり、オブジェクトはインスタンスより広い概念です。

    もっとも、具体的なインスタンスをとらないような「オブジェクト」を扱う場面はRubyのプログラムを書く上では来ないので(他の言語では、クラス自体が通常の言語で発生するインスタンスと本質的に違うものとなっていることもありますが、RubyではそれもClassクラスから生成したインスタンスです)、「オブジェクト=インスタンス」と捉えて特段の問題はありません。

    http://write-remember.com/archives/697/ (参考)

    キャンセル

  • 2015/08/28 11:07

    全くの余談ですが、Ruby 1.9以上では「BasicObject」というクラスがあって、Object自体の挙動を乗っ取るようなクラスを作りたい場合に、Objectを継承しないで作ることもできます。

    http://docs.ruby-lang.org/ja/2.1.0/class/BasicObject.html

    キャンセル

  • 2015/08/29 16:01 編集

    ご回答ありがとうございます。

    1オブジェクト指向におけるものの定義に関して

    1オブジェクト指向で扱う「もの」とはオブジェクトと定義するという抽象的な概念。
    2ものとはつまり、オブジェクト指向で扱う情報、リソースのことである。
    3ゆえに、オブジェクト指向で扱う「もの」とは、情報それ自体である。

    という認識でよろしいでしょうか。(間違っている、間違っていない、かつ間違っている場合は認識を正していただければと思います。)

    2 オブジェクト=インスタンスと捉えることは、特段間違いではない。
    なぜなら、
    Rubyでは大抵のオブジェクトは、Objectクラスのインスタンスであるためである。

    では、なぜインスタンスと明示しないのでしょうか。
    広義の意味においてRubyの扱う"もの"は、オブジェクトです。
    ただ、大抵のオブジェクトはObjectクラスを継承しているインスタンスとなります。
    ならば、より厳密さを明示するならRubyの扱うものは、インスタンスである。と定義したほうが明示的ではないのかと考えます。

    より、理解を深めたいため質問させていただきます。

    よろしくお願い申し上げます。

    キャンセル

0

  1.  オブジェクトとそうでないものの違い
  2.  オブジェクト、クラス、インスタンスの違い
  3.  Rubyと他言語との違い

上記3点、基本的なところから整理していきます。




オブジェクト指向における「オブジェクト」には、
いろいろな見解がありますが、最大公約数的には、
(ユーザが定義する)処理とデータを一体にした単位です。


たとえばJavaでは、参照型とプリミティブ型という区別があって、
int型などの数値はプリミティブ型で、オブジェクトではありません。

対してRubyでは、Integerなどの数値もオブジェクトです。
処理(メソッド)とデータを一体にできるからオブジェクトです。


なお、ご質問にある「Objectクラスを継承している」かどうかは、
一般的なオブジェクトの定義には関係ありません。

Ruby(やSmalltalk)だとそうなっているというだけなので、
「Objectクラスを継承しているのがオブジェクトだよね」
といっても一般に通じないと思います。




クラスとインスタンスは、オブジェクトに関係する用語です。
クラスとインスタンスの違いは、概念と実体の違いです。

分かりやすくたとえると、太郎は人間だし、花子も人間とします。
また、太郎と花子は日本人です。

このとき、人間がオブジェクトだとすると、
太郎や花子がインスタンスで、日本人はクラスです。

日本人が人間なのか、もっと言うと
人間が人間なのかどうかは微妙なところです。

概念上では人間ですが、実体ある人物ではありません。
「白馬は馬でない」みたいな話になってきます。


一般的にインスタンスよりオブジェクトのほうが広い概念です。
「インスタンス指向」ではなく、「オブジェクト指向」と言うでしょう。

「インスタンスはオブジェクトである」は問題ありませんが、
「オブジェクトはインスタンスである」とは言いきれません。




Rubyでは「(ほぼ)すべてがオブジェクトである」とよく言われます。
これはSmalltalkのやり方を踏襲したものですが、
他の言語は必ずしもそうではありません。

先に挙げたように、Javaではプリミティブ型があるので、
すべてがオブジェクトというわけではありません。

また、Ruby(やSmalltalk)ではクラスもオブジェクトですが、
JavaやC++ではそうではありません。

これは同じオブジェクト指向でも
動的言語と静的言語といった違いがあり、
設計思想が根本から異なっているためです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る