2016-04-30 8 views
0

私はRubyでオブジェクトがインスタンス変数の束であり、クラスへのリンクであることを知りました。(Ruby 2のメタプログラミング、Pragmatic Bookshelf)Rubyに格納されている変数の値はどこですか?

変数を作成するときに、クラスのインスタンスを作成して値を割り当てます。この値がインスタンス変数としてオブジェクトに格納されていると誤っていますか? instance_variablesを呼び出すと、どれも表示されません。例:オブジェクトがあり、それは"hello"に等しい

str = "hello"   # => "hello" 
str.class    # => String 
str.instance_variables # => [] 

str場合"hello"が保存されていますか?

+0

ネイティブクラスは...特別です。 –

+0

このようなインスタンス変数が存在するとしたら、それで何が期待できますか? –

+0

@JanDvorakはおそらく '@value =" hello "'のようなものでしょうか?知りません。私はネイティブのRubyクラスの多くがC言語で書かれていることを知っています。おそらくそれらは例外です。私の頭脳では何かがクリックされていません。 – wetjosh

答えて

0

Rubyクラスの中には、Janが指摘しているように特別なものがあります。つまり、内部はCではRubyではなく実装されているため、通常のリフレクションツールでは見えません。

Ruby sourceの内部を見ると、これがどのように機能するか見ることができます。

文字列の場合、文字列自体を格納するインスタンス変数はありません。文字列自体はです。が格納されています。

0

ローカル変数strはインスタンス変数ではありません。

インスタンス変数を作成すると、オブジェクトに格納されます。ただし、変数自体にinstance_variablesを呼び出すことは意味がありません。そのオブジェクトが格納されているオブジェクト(この場合は暗黙のメインコンテキスト)で呼び出す必要があります。

@str = "hello" 
instance_variables # => [:@str] 
+0

私は、理解できないスキルのために、これが行われていない人を誰でも願っています。 「ストア」または「ロケーション」によって、OPは物理メモリの場所を意味するのではなく、OOPに関してより抽象的な意味で言及しています。 – sawa

2

変数はオブジェクトではありません。 は、のソースコード内のオブジェクトを参照する方法を提供するプログラミング言語の構造です。例えば

は、以下のコードでは、bのinitalizationはない新しいオブジェクト、オブジェクトを参照するだけで新しい変数を作成しない:

2.3.0 :012 > a = 'a string' 
=> "a string" 
2.3.0 :013 > b = a 
=> "a string" 
+0

しかし、 'a'はどうですか? 'a'を作成したときにオブジェクトを作成し、そのオブジェクトに値を割り当てました。オブジェクトにない場合、その値はどこにありますか?それをオブジェクトに生きていると私はどのように想像すべきですか? @JanDvorak氏は、オブジェクトの文脈で「自己」という価値について興味深いことを言った。それを確認したり、それを拡大したりできますか? – wetjosh

+0

いいえ、文字列リテラル ''a string' 'を指定したときにのみ、' a'を作成したときにオブジェクトが作成されませんでした。 'a'と' b'への代入は、新しいオブジェクトの作成をもたらしませんでした。値はオブジェクトであり、その逆もあります。変数は値またはオブジェクトを参照するための単なる構成体です。 @ JanDvorakのコメントに関して、私はそれを理解していません。 –

関連する問題