у меня есть это, если состояние:foo (: bar) если foo (: bar)! = 0 рельсы-way?
foo(:bar) if foo(:bar) != 0
, и я спросил себя, если есть лучше «rails-/рубинового путь», чтобы выразить это состояние? (Не вызывая foo (: bar) дважды?)
у меня есть это, если состояние:foo (: bar) если foo (: bar)! = 0 рельсы-way?
foo(:bar) if foo(:bar) != 0
, и я спросил себя, если есть лучше «rails-/рубинового путь», чтобы выразить это состояние? (Не вызывая foo (: bar) дважды?)
Ваш пример - довольно обычный способ сделать это. как сказал @ndn, вы можете назначить переменную, если ваш метод foo либо не работает, либо очень многословен, и в результате неудобно дважды звонить.
baz if (baz = foo(:bar)) != 0
Я не могу придумать способ сделать это без ссылки foo(:bar)
дважды. Ruby имеет способы обработки ответа nil
и замены другого значения, но не нулевого значения.
foo(:bar) unless foo(:bar).zero?
foo(:bar).zero? ? nil : foo(:bar)
Так вы хотите, чтобы вызвать функцию, только если результат этой функции не равен 0. Это означает, что вы должны вызвать функцию в любом случае, чтобы проверить это результат, так просто:
foo(:bar)
Это без контекста, если вы предоставляете некоторый контекст для того, где вы используете это, я уверен, что мы могли бы предоставить лучшие варианты.
[foo(:bar)].find{ |x| x.nonzero? }
, конечно, в общем случае, вы можете использовать любой другой предикат, который вы хотите вместо x.nonzero?
В случае приведенного в вопросе, вы можете написать еще проще
[foo(:baz)].find(&:nonzero?)
Это гениально! – SteveTurczyn
Спасибо @Steve. Когда я прочитал ваш комментарий, мне пришло в голову, что для этого случая мне не нужна переменная 'x'. –
Вы необходимо предоставить контекст, в котором вы это называете. Сначала я думал, что вы хотите сделать вызов метода, если какое-то условие было выполнено, но вы вызываете тот же самый метод, чтобы проверить условие ':)', поэтому, пожалуйста, предоставьте дополнительную информацию об этом –
Я представляю, что это просто пример. возьмите это вместо 'foo (: bar), если ['x', 'y']. member? (foo (: bar))'. то есть запустить метод, если возвращаемое значение является частью некоторой коллекции. в общем случае, это дает мне возвращаемое значение этого метода, если возвращаемое значение удовлетворяет некоторому условию. – PhilVarg
thx для всех ответов, но почему downvote? –