Преобразовать строку в имя переменной в ruby - PullRequest
5 голосов
/ 08 января 2011

У меня есть переменные

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

3 голосов
/ 08 января 2011

Я не думаю, что есть способ сделать это. Есть переменные экземпляра или класса, но с локальными переменными очень редко возникает необходимость.

В вашем случае вы действительно должны хранить данные в хэше. Кроме того, подобная логика действительно не относится к эрб. Вы хотите что-то вроде:

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 голосов
/ 14 июня 2012

Теперь я знаю, что этот вопрос немного устарел, но есть более простой способ сделать это и использовать стандартный метод 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

Это СУХОЙ и очень простойчтобы понять.:)

0 голосов
/ 21 марта 2013

Еще один ответ на этот старый вопрос.

В моем сценарии я хотел подсчитать, сколько раз в день показывалось в массиве дней (day_array).Мне не нужно было знать, не появился ли день в day_array, поэтому я не инициализировал хеш days_count, как gunn в его ответе .

Вот как я это сделал:

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}

По сути, в соответствии с предыдущими ответами.Но я подумал, что дополнительный пример не повредит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...