Вас волнует разница между nil
и false
здесь?Если вас волнует, является ли возвращаемое значение каждого метода «ложным», то это довольно рубиновый способ сделать это:
def search_record(*args)
expensive_operation_1(foo) ||
expensive_operation_2(foo, bar) ||
expensive_operation_3(baz) ||
expensive_operation_4(foo, baz)
end
Если вы не знакомы с этой идиомой, это можно объяснить таким образом: Ruby, как и большинство языков, "короткие замыкания" ИЛИ сравнения, что означает, что если первый операнд оценивается как "truey", он не потрудится вычислить второй операнд (т.е. если expensive_operation_1
возвращает что-то другоечем nil
или false
, он никогда не будет вызывать expensive_operation_2
), потому что он уже знает, что результат логической операции имеет значение true.
Еще одна полезная вещь, которую делает Ruby вместовозвращая true
или false
из логических операций, он просто возвращает последний операнд, который он вычисляет.Таким образом, в этом случае, если expensive_operation_1
вернет nil
, он вызовет expensive_operation_2
, и если это вернет значение (не ложное), все выражение будет просто равно этому значению.
* 1020Наконец, мы можем связать эти логические значения так, что, по сути, он вернет результат первого операнда, который не является ложным, и никогда не оценит последующие операнды.Если
все операндов оцениваются как ложные, он вернет последний операнд (который, как мы знаем, ложный и, в вашем случае, вероятно,
nil
).