Рубиновые условные выражения
Как выразить несколько или параметры в условном выражении в Ruby? Я думал, что-то вроде этого будет работать, но это не так:
1 == (3 || 2 || 1)
(1 == (3 || 2 || 1))
Я думал, что это вернет истину.
Я хочу, чтобы какой-то способ сказать, что любое число из группы истинно, вернуть true. Должен ли я это прописать?
if (1 == 3 || 1 == 2 || 1 == 1)
На английском я бы сказал
Если 1 равно 3, 2 или 1, верните true.
4 ответа
Да, это один из способов сделать это. Еще бы Рубески было бы:
if [3, 2, 1].include?(1)
Причина того, что 1 == (3 || 2 || 1)
не работает, потому что (3 || 2 || 1)
оценивается первым. ||
Оператор возвращает первое значение, если оно верно, и второе, если первое - ложь.
таким образом (3 || 2 || 1)
является 3
так вы сравниваете 1 == 3
что, очевидно, false
,
include
метод делает то, что вы хотите. Кроме того, вы можете использовать any?
методы, которые довольно хорошо выражают то, что вы хотите:
[1, 2, 3].any? { |v| 1 == v }
Но для равенства вы можете просто использовать include
,
Если ваши значения для проверки не являются смежными, то Array#include?
хороший выбор
Если значения теста являются случайными и могут быть выражены как диапазон, вы можете использовать:
Range#cover?
Range#include?
Range#member?
Например:
(1..3).member?(1) # => true
include?
а также member?
возможно, немного более универсальны, определены в Enumerable и применимы к любому объекту коллекции или классу, производному от него. Enumerable также определяет any?
, использованный в другом ответе на этот вопрос, плюс none?
а также one?
,
case when
Условно поддерживает несколько вариантов:
x = 1
puts case x
when 1, 2, 3 then "Low"
when 4, 5, 6 then "High"
else "Strange dice..."
end
#=>Low