2011-08-11 7 views
2

ローカルのRuby名前空間に新しい変数をプログラムで挿入します。たとえば、書くことができるようにしたいRuby:変数をローカル名前空間にエクスポート

label = 'some_name' 
# some code equivalent to 
# some_name = 3 
# but using only 'label' to get the name. 
puts some_name # returns 3 

これを行うには、ここで何を入力しますか?

+0

シンボルを言うときは、Rubyのシンボルを参照していないと思います(例:a_symbol)。そして、コードの後の行で使用されていない場合は、ラベルは正確に何ですか? – mikong

+0

@ミコン:ありがとう、私は質問を明確にした。私は 'some_name'を後でコードで利用できるようにします。 'label'は、変数を何を呼び出すべきかを知るためのメカニズムに過ぎないと仮定できます。 – Peter

+0

最初はRubyの定数を使うべきだと思っていました。しかし、あなたはラベルを任意に変更したいと思うし、あなたのputs行は正しい新しい名前に変更することができますか?私は、あなたが確認した後、少し解を書きます。 – mikong

答えて

3

もう一度答えました.SO question similar to thisです。短い答えはこれです。具体的には、別の変数の値に基づいてローカル変数を作成し、それを行う方法はありません。それだけでを作成したいのですが、ローカルを作成したようにのように見えますが、それは本当にルビーの魔法です。そして、@ mikongの答えは一つの方法です。

制約を緩和し、代わりにインスタンス変数を作成すると、となります。

label = 'some_name' 
self.instance_variable_set("#{label}", 3) 
puts @some_name 

あなたも、動的にアクセサを定義することができ、その後、あなたは見苦しい@を取り除くことができますが、もう一度、あなたは単にローカルではなく、本当のローカル変数を装っ方法があります。

+0

動的に定義された 'attr_reader'の+1。これは私の目標を達成することができます。 – Peter

2
label = 'some_name' 
eval "#{label} = 3" 
puts eval "#{label}" 
puts local_variables 

あなたが実行する機会を持っていないと思われるだろうことに注意してください...

puts some_name 

...あなたが作成するつもりだった地元のものを変数を知っていた場合、名前には必要はないであろうので、実行時コード付きのものです。なぜなら、some_nameの代入が決して解析されなかったため、通訳者はputs some_nameに直接アクセスすることができないからです。しかしであり、であり、puts local_variablesとして表示することができます。それにもかかわらず、あなたが必要なもので動作するようです

class Example 
    attr_accessor :label 

    def method_missing(name, *args, &block) 
    return some_processing if name == label.to_sym 
    end 

    def some_processing 
    3 # of course, this can be something more complicated 
    end 

    def test 
    @label = 'some_name' 
    puts some_name 
    end 

end 

+0

興味深い。あなたのコードのすべての4行は、私のためにRuby-1.8.7-p334で動作します。しかし、ruby-1.9.2-p180で同じプログラムを実行した場合、 'puts local_variables'は" label "と' puts eval "のみを出力します。#{label}'は例外を発生させます: 'test.rb:3: :定義されていないローカル変数またはメソッド 'some_name' for main:Object(NameError) '。 –

+0

これは、1.9ローカル変数が定義されている' eval'のコンテキスト内でのみ利用可能であるからです。あなたが持っているものを得ることができます:) – skorks

+0

Hmm。だから、ローカル変数ではなくインスタンス変数の作成に切り替えるか、複雑なデータ構造を最初から使用しているため、個々の名前を動的に作成する必要はありません。単純なHashキーを使用してRubyレベルの名前を作成することは難しいです最初の場所では*アドバイス、時には動機づけは学問的な好奇心ですが、この場合は...) – DigitalRoss

2

次は、上記の2行の間、正確にコードではありません。メカニズムはあなたが与えたものから変更されました(ラベルは現在属性です)。また、技術的には、変数ではなく、必要なものを返す動的な名前を持つメソッドです。

個人的には、「変数」の名前が変更されるため、要件が少し危険に思えると思います。私の例ではおそらくコードを使用しないでしょう。私はプロジェクトの要求に応じて、私は別のアプローチを考えています。

関連する問題