2015-08-26 2 views
0

у меня есть это, если состояние:foo (: bar) если foo (: bar)! = 0 рельсы-way?

foo(:bar) if foo(:bar) != 0 

, и я спросил себя, если есть лучше «rails-/рубинового путь», чтобы выразить это состояние? (Не вызывая foo (: bar) дважды?)

+2

Вы необходимо предоставить контекст, в котором вы это называете. Сначала я думал, что вы хотите сделать вызов метода, если какое-то условие было выполнено, но вы вызываете тот же самый метод, чтобы проверить условие ':)', поэтому, пожалуйста, предоставьте дополнительную информацию об этом –

+0

Я представляю, что это просто пример. возьмите это вместо 'foo (: bar), если ['x', 'y']. member? (foo (: bar))'. то есть запустить метод, если возвращаемое значение является частью некоторой коллекции. в общем случае, это дает мне возвращаемое значение этого метода, если возвращаемое значение удовлетворяет некоторому условию. – PhilVarg

+0

thx для всех ответов, но почему downvote? –

ответ

2

Ваш пример - довольно обычный способ сделать это. как сказал @ndn, вы можете назначить переменную, если ваш метод foo либо не работает, либо очень многословен, и в результате неудобно дважды звонить.

baz if (baz = foo(:bar)) != 0 
1

Я не могу придумать способ сделать это без ссылки foo(:bar) дважды. Ruby имеет способы обработки ответа nil и замены другого значения, но не нулевого значения.

foo(:bar) unless foo(:bar).zero? 

foo(:bar).zero? ? nil : foo(:bar) 
0

Так вы хотите, чтобы вызвать функцию, только если результат этой функции не равен 0. Это означает, что вы должны вызвать функцию в любом случае, чтобы проверить это результат, так просто:

foo(:bar) 

Это без контекста, если вы предоставляете некоторый контекст для того, где вы используете это, я уверен, что мы могли бы предоставить лучшие варианты.

1
[foo(:bar)].find{ |x| x.nonzero? } 

, конечно, в общем случае, вы можете использовать любой другой предикат, который вы хотите вместо x.nonzero?

В случае приведенного в вопросе, вы можете написать еще проще

[foo(:baz)].find(&:nonzero?) 
+0

Это гениально! – SteveTurczyn

+0

Спасибо @Steve. Когда я прочитал ваш комментарий, мне пришло в голову, что для этого случая мне не нужна переменная 'x'. –

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