2013-11-08 5 views
0

Я пытаюсь заставить оператор == соответствовать двум возможным значениям.рубин как использовать "||" (или-equals) в скобках после «==», чтобы соответствовать нескольким выражениям, то есть x == (5 || 6)

def demo(x) 
    puts "foo!" if x == (5 || 7) 
end 

demo(5) 
#=> "foo!" 
demo(7) 
#=> nil 

Так что это не работает, но есть способ, чтобы соответствовать несколько значений в конце == оператора в рубин? Я думаю, что видел это раньше, поэтому я и попробовал, но я не уверен в этом.

ответ

3

Как это:

def demo(x) 
    puts "foo!" if x == 5 || x == 7 
end 

x == (5 || 7) не будет работать, потому что 5 || 7 является 5, так что это так же, как x == 5.

2

Вот некоторые варианты

... if x == 5 || x == 7 
... if [5, 7].include?(x) 
... if x.in?(5, 7) # if in rails 
2

Чтобы ответить на ваш вопрос: Нет, это не представляется возможным: http://phrogz.net/programmingruby/language.html

Операторы сравнения

Синтаксис рубин определяет операторы сравнения ==, ===, < => <, < =,>,> =, = ~, а стандартные методы eql? и равны? (см. таблицу 7.1). Все эти операторы реализованы как методы. Хотя операторы имеют интуитивное значение, это зависит от классов, которые реализуют их для создания значимой семантики сравнения. Справочник библиотеки описывает семантику сравнения для встроенных классов. Модуль Comparable обеспечивает поддержку для реализации операторов ==, <, < =,>,> = и метод между? в терминах < =>. Оператор === используется в случае выражений, описанных в разделе «Выражения случая».

Так что это метод с одним аргументом. и (x||y) всегда будет возвращать x, если x не является ложным.

+0

больше (полная) версия второго компонента Ю. Хао ответ, спасибо Ян –

+0

получил его, '(1 || 2) == 1 # => true' –

1

Это немного злоупотребления case, но это может сделать его легко читать, и писать, это своего рода код:

def demo(x) 
    case x 
    when 5, 7 
    puts "foo!" 
    end 
end 

Обычно мы бы больше when положения.Хорошая вещь об этом, то легко добавить больше значения, x должен соответствовать:

def demo(x) 
    case x 
    when 5, 7, 9..11 
    puts "foo!" 
    end 
end 

[5, 7, 10].each do |i| 
    demo(i) 
end 

Running, что приводит к:

foo! 
foo! 
foo! 

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

case x 
when 5, 7, 9..11, 14, 15, 20..30 
    puts "foo!" 
end 

Versus:

puts 'foo!' if (x == 5 || x == 7 || x == 14 || x == 15 || 9..11 === x || 20..30 === x) 

Или:

puts 'foo!' if (
    x == 5 || 
    x == 7 || 
    x == 14 || 
    x == 15 || 
    9..11 === x || 
    20..30 === x 
) 
+0

да это другое. хороший, я обязательно буду использовать это. То, что я действительно делаю в своем прото-приложении/кодексе сегодня, вызывает подсказки от пользователя в командной строке и обработку этих ответов, поэтому метод case, вероятно, самый «похожий на рубин» (т. Е. Прозаический, читаемый) этих ответов. Непосредственно использование низкоуровневых условных методов более похоже на подход «C-стиля», возможно, –

+0

Ну, C поддерживает 'switch' и' case', который сродни «случаю» Ruby и 'when' соответственно, поэтому его можно очистить мило. Теперь Perl ... это другое дело. :-) –

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

  • Нет связанных вопросов^_^