2016-02-06 60 views
-1

我知道我們可以EVAL一個字符串,得到這樣一個現有的變量:Ruby可以從字符串創建變量嗎?

foo = "foo" 
bar = "bar" 
%w{foo bar}.each do |baz| 
    puts eval(baz) 
end 
=> "foo", "bar" 

但有可能反其道而行之,這樣的嗎?

%w{foo bar}.each do |baz| 
    eval(baz) = baz 
end 

我知道的哈希會爲目的的工作,但哈希感覺只是一對夫婦的變量矯枉過正。除了創建實例變量之外,還有更好的方法嗎?

+1

你試過了嗎? – Jon

+1

嘿@marwei,看看這個帖子:http://stackoverflow.com/questions/18552891/how-to-dynamically-create-a-local-variable –

+0

如果使用即使一個哈希是一個矯枉過正,然後引入一些幻想該循環更加矯枉過正。 – sawa

回答

0

您可以用實例變量這樣做:

%w{foo bar}.each do |baz| 
    instance_variable_set "@#{baz}", baz 
end 

puts @foo 
puts @bar 

看起來你無法與局部變量做到這一點,雖然。

+0

感謝您的回答。我知道instance_variable_set方法。但是有沒有辦法創建一個局部變量?我不認爲%w {foo bar} .each會做| baz | eval「#{baz} =#{baz}」 end works ... – marwei

+1

從v1.9開始,我們無法動態創建局部變量。在此之前,你可以用'eval'來完成。 –

+0

我想即使在1.9之前,你也無法用eval創建新的本地變量,但是你可以寫入已經在你的'eval'語句之外定義的現有變量。 – Jon

0

如果我猜對了,你想要一個字符串並將其用作setter。

%w{foo bar}.each do |baz| 
    send("#{baz}=", baz) 
end 

我應該更加關注問題的標題。如果你真的想直接設置變量,原始答案是正確的。

%w{foo bar}.each do |baz| 
    instance_variable_set("@#{baz}", baz) 
end 
相關問題