2011-01-08 74 views
5

我有變量字符串轉換爲變量名紅寶石

<% mon_has_two_sets_of_working_hours = 0 %> 
<% tue_has_two_sets_of_working_hours = 0 %> 
<% wed_has_two_sets_of_working_hours = 0 %> 

我要動態地改變這些變量的值。

<% days_array = ['mon', 'tue', 'wed'] %> 

<% days_array.each do |day| %> 
    <% if condition? %> 
    # here i want to set %> 
    <% "#{day}__has_two_sets_of_working_hours" = 1 %> 
    end 
end 

該值未被賦值。有沒有辦法動態地賦值給變量?

+4

做,做,使用數組(或哈希)。 – 2011-01-08 12:10:17

+3

[2530112](http://stackoverflow.com/questions/2530112)的答案應該有所幫助,它建議`instance_variable_set`。 – 2011-01-08 12:18:18

回答

3

我不認爲有辦法做到這一點。有實例或類變量,但是對於局部變量,很少有很好的需求。

在你的情況你真的應該有一個哈希數據。而且,像這樣的邏輯實際上不屬於erb。你想要的東西,如:

working_hour_sets = %w[mon tue wed thu fri sat sun].inject({}) do |hash, day| 
    hash[day]=0; 
    hash 
end 
# puts working_hour_sets #=> {"wed"=>0, "sun"=>0, "thu"=>0, "mon"=>0, "tue"=>0, "sat"=>0, "fri"=>0} 

working_hour_sets.each do |day, value| 
    working_hour_sets[day] = 1 if condition? 
end 
2

現在,我知道這是cuestion有點老了,但有一個更簡單的方法來做到這一點,使用非標準紅寶石發送方法。這實際上是使Ruby在元編程世界變得如此敏捷的方法之一。

這實際上是一個配置設置我在Rails應用程序中使用:

# In a YAML  
twitter: 
    consumer_key: 'CONSUMER-KEY' 
    consumer_secret: 'CONSUMER-SECRET' 
    oauth_token: 'OAUTH-KEY' 
    oauth_token_secret: 'OAUTH-SECRET' 

... 

# And in your file.rb 
config = YAML.load_file(Rails.root.join("config", "social_keys.yml"))[Rails.env]['twitter'] 

Twitter.configure do |twitter| 
    config.each_key do |k| 
    twitter.send("#{k}=", config[k]) 
    end 
end 

這是乾燥,很容易理解。 :)

0

這個老問題的又一個答案。

在我的場景中,我想要統計一天中出現多少次(day_array)。我不需要知道是否一天沒有出現在day_array中,所以我沒有初始化days_count散列,因爲gunnhis answer中做過。

我是這樣做的:

def count_days(day_array) 
    days_count = {} 
    day_array.each do |day| 
    days_count[day].nil? ? days_count[day] = 1 : days_count[day] = days_count[day] + 1 
    end 
    puts days_count 
end 

如果我複製並粘貼在IRB以上,則:

> count_days(%w[SU MO]) 
{"SU"=>1, "MO"=>1} 

> count_days(%w[SU SU MO]) 
{"SU"=>2, "MO"=>1} 

基本上,與以前的答案是一致的。但是,我認爲還有一個例子不會受到傷害。