在ruby中将字符串转换为变量名

时间:2011-01-08 12:06:43

标签: ruby

我有变量

 <% 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

未分配该值。有没有办法动态地为变量赋值?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

现在,我知道这个问题有点陈旧,但有一种更简单的方法可以做到这一点并使用标准的Ruby send方法。这实际上是使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

这很干,很容易理解。 :)

答案 2 :(得分:0)

这个老问题的另一个答案。

在我的场景中,我想计算一天中出现的次数(day_array)。我不需要知道day_array中是否有一天没有出现,所以我没有在gunn中初始化days_count哈希为his answer。< / p>

我是这样做的:

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}

基本上,与先前的答案一致。但是,我认为另一个例子不会受到伤害。