2009-03-18 7 views
1

私は、この例のRubyコードfrom a blog entryを理解しようとしています。これは、DEFAULT、:say、:@message "というシンボルを使用して識別子を検索します。しかし、私が知ることから、それは識別子を検索するのではなく、それらの識別子に関連付けられた値です。私は識別子が変数やメソッドなどの名前だと思ったので、識別子は「DEFAULT」「」「メッセージ」となります。プログラムの出力は以下の通りです。このRubyコードは、識別子またはそれに関連付けられた値をルックアップしますか?

また、なぜ識別子を検索する必要がありますか?私は、コードを実行すると

class Demo 
    # The stuff we'll look up. 
    DEFAULT = "Hello" 
    def initialize 
    @message = DEFAULT 
    end 
    def say() @message end 

    # Use symbols to look up identifiers. 
    def look_up_with_symbols 
    [Demo.const_get(:DEFAULT), 
    method(:say), 
    instance_variable_get(:@message)] 
    end 
end 

dem = Demo.new 
puts dem.look_up_with_symbols 

私はこの出力を得る:

Hello 
#<Method: Demo#say> 
Hello 

答えて

2

サンプルコードは、三つのことで取得するためにシンボルを使用して:(:DEFAULT介してアクセス)DEFAULT CONST、(:say介してアクセス)メソッドオブジェクトの値、および(:@message介してアクセス)インスタンス変数の値。 3つのオブジェクトのどれもシンボルを使用して定義されていませんが、シンボルを使用してアクセスできます。

これはかなり簡単な例です。大きな理由は、何らかの理由で識別子を介して直接参照したくない場合、シンボルを使用して定数、メソッド、インスタンス変数を参照できることです。私はこれがメタプログラミングで最も頻繁に使われるのを見ています。

0

はい、これらは様々な識別子の値を調べます。

あなたは何をしようとしているのかよく分かりませんが、シンボル(:DEFAULT)を文字列( "DEFAULT")に変換する必要がある場合はto_s(:DEFAULT.to__s)を使用してください。可能なすべての識別子を検索する場合は、探しているものに依存します。

myobject.methods # show a list of instance methods an object has (like "say" above) 
myobject.instance_variables # show a list of instance variables an object has (like "@message" above) 
myobject.class.constants # show a list of class level constants (like "DEFAULT" above) 

デバッグや新しいAPIの試用時に、これらの方法の中で最も多くのマイレージが得られます。私がおそらく生産コードでこれらを使用する唯一の理由は、オブジェクトの自動文字列表現(XML、HTML、CSV)を出力することです。

関連する問題