2012-01-12 3 views
1

Я пытаюсь выяснить, есть ли уборщик способ, чтобы написать что-то вроде этого:Есть ли более чистый способ написать такой вид Ruby?

if var1 == "hi" || var1 == "bye" || var1 == "well" || var1 == "hello" 
    puts var1 
end 

В принципе, есть одна переменная, и я хочу, чтобы выяснить, если он равен одному из нескольких возможных значений.

Я попытался следующие, но это был недействителен:

if var1 == ("hi" || "bye" || "well" || "hello") 
    puts var1 
end 

ответ

6
puts var1 if %w(hi bye well hello).include? var1 
+1

Ничего себе, это потрясающе! Спасибо. Для любого, кто находит этот вопрос в будущем,% w трудно вводить в поисковые системы, так что вот ссылка на связанный с ним вопрос о том, как их использовать: http://stackoverflow.com/questions/4287503/where-in- the-ruby-language-is-qw-etc-defined – jay

+1

Фактически% w не является ключевой частью решения, это просто еще один способ создания массивов. «['hi', 'bye', 'well', 'hello']. include? var1" будет делать то же самое. – jrochkind

1

Если список больше, и вы будете проверять это много, то вы можете сэкономить время, используя хэш :

want = Hash[%w{hi bye well hello}.map { |s| [ s, true ] }] 
puts var1 if(want[var1]) 

или Set:

want = Set[*%w{hi bye well hello}] # Or want = %w{...}.to_set 
puts var1 if want.include? var1 

Создание хэша или набора - одноразовый удар, но проверка Хэша будет намного быстрее, чем сканирование массива с помощью include?. Разница может стоить того, если есть много вещей, чтобы проверить или если вы проверяете снова и снова.

+1

Установите [% w {hi bye well hello}], написав это, Set получил только одно значение с массивом, поэтому код не работает. Может быть,% w {привет, привет, привет) .to_set? – oldergod

+1

@oldergod: Я думаю, что я оставил знак ('Set [*% w {...}]'), но 'to_set' будет работать так же хорошо. Спасибо, что заметили это. –

Смежные вопросы