10

現在のコンテキストで以前に未定義の変数を動的に定義できる方法があるかどうか疑問に思っています。例えば:

foo # => NameError: undefined method or local variable ...
# Some method call which sets foo = 1 in the local context
foo # => 1

別の言い方をすれば、それが未定義であることを考えると、変数を使用せずfooにローカル変数を定義できるコードを探しています (たとえば、値が である他の変数があり、値を設定するためにそれに依存しなければならなかった場合)の)。foofoobar:foofoo

Ruby 2.1 では、eval('foo = 1')orまたははすべて次と同等のようです。eval('foo = 1', binding)binding.local_variable_set(:foo, 1)

1.times do
  foo = 1
end

つまり、新しいローカル コンテキストfooのコンテキストで設定し、そのコンテキストの外では値にアクセスできないようにします。

私がやろうとしていることは可能ですか?

更新: この質問は、特定のローカル変数コンテキスト (モジュール/クラス、メソッド、proc、ブロックなど) に固有のものではありません。それができる、またはできない状況を明確に知りたいと思います。

4

3 に答える 3

10

Ruby の魔法が方法を提供するように見えますが、Matz によると、これは 1.8 viaevalおよび特定のコンテキスト (つまりirb) でのみ可能でした。1.9 の時点で、この動作は取り除かれました (「厳密に禁止されています」):

Matz 自身がここで検討しています: https://www.ruby-forum.com/topic/155673#685906

Rubyがローカル変数を動的に作成できないことをどこかから読みました。それは本当ですか、それとも単なるバグですか?

ローカル変数はコンパイル時に作成されるため、eval() で定義されたローカル変数は eval の外部ではアクセスできません。1.8 では irb と tryruby は、ローカル変数が eval() からこぼれるように行ごとのコンパイルを行いますが、1.9 では、行ごとのコンパイルの下でも固く禁じられています。

          matz.

(ここでは、このようなものを望んでいるが、質問者が抱えている正確な技術的状況ではない人のための非sequiturの代替手段):

ハッシュを使用します。

local_hash = {}

my_vars.each_pair do |k,v|
   local_hash[k] = v
end

puts local_hash['foo']
#=> 'baz'
于 2013-10-11T17:22:16.773 に答える
0

クラスのインスタンス変数は役に立ちますか?

class Cat
end
Cat.instance_variable_set '@last_words', 'meow, meow, me...'
Cat.instance_variable_get '@last_words' # => "meow, meow, me..."
Cat.new.instance_variable_get '@last_words' # => nil

そうでない場合は、コンテキストとローカル変数の使用方法について詳しく説明してください。

于 2013-10-11T20:04:26.000 に答える