2016-07-19 4 views
2

モジュールドキュメントを読んでいるときに、私はこれらの2つのクラスについて混乱します。 まず、名前付き定数を指定されたオブジェクトに設定する方法があることがわかりました。Rubyオブジェクトとモジュール

Object.const_set("FOO", 40)

しかし、私はRubyのドキュメントをチェックし、Object方法にはconst_setはその後、私はそれがModuleで定義されていた見つけた、ありません。

私はObjectがすべてのRubyオブジェクトのデフォルトルートだと思いました。なぜそれはモジュールメソッドを使用できますか?私はそれらの間の関係について混乱しています。 :const_set以下に示すように

+0

ここにヒントがあります:あなたは 'を呼び出す場合は、「あなたは' upcase'方法を探しますHello'.upcase'、...文字列に '」Hello''またはそのクラス(' STRING')とそのスーパークラス?ここで 'Object.const_set'を呼び出すと、' Object'クラスやそのクラス( 'Class')とそのスーパークラスで' const_set'メソッドをどこから探しますか? –

答えて

2

Moduleに格納されたインスタンスメソッドである:

Module.instance_methods(false).include? :const_set #=> true 

ObjectClassのインスタンスであることに注意:

Object.instance_of? Class #=> true 

そしてClassModuleのサブクラスである:

Class.superclass #=> Module 

これは、Moduleに定義されているインスタンスメソッドが継承を介してオブジェクトClassで利用できることを意味します。したがって、Classのインスタンス(Objectなど)は、Moduleに格納されているすべてのインスタンスメソッド(:const_setを含む)を自由に使用できます。

+1

ありがとうございます。 Rubyは本当に驚くべき言語です。 –

1

ルビーでは、基本的にすべてのクラスはClassクラスのインスタンスであり、すべてのクラスはObjectのサブクラスです。 ObjectClassの両方がクラスです。実行した場合

Object.is_a?class 
Class.is_a?class 

いずれの場合も、trueの値が得られます。 Classそのため、あなたは

Object.const_set("FOO", 40) 
0

を使用することができます#ancestorsはあなたのオブジェクトモデルにいくつかのより多くのコンテキストを与えることもあり、祖先の一つとしてModuleを持っています。

> Module.ancestors 
=> [Module, Object, PP::ObjectMixin, Kernel, BasicObject] 
関連する問題