Ruby ternary operator without else

RubyOperatorsConditionalConditional Operator

Ruby Problem Overview


Is there a ruby idiom for "If do-this," and "do-this" just as a simple command?

for example, I'm currently doing

object.method ? a.action : nil

to leave the else clause empty, but I feel like there's probably a more idiomatic way of doing this that doesn't involve having to specify a nil at the end. (and alternatively, I feel like taking up multiple lines of code would be wasteful in this case.

Ruby Solutions


Solution 1 - Ruby

As a general rule: you pretty much never need the ternary operator in Ruby. The reason why you need it in C, is because in C if is a statement, so if you want to return a value you have to use the ternary operator, which is an expression.

In Ruby, everything is an expression, there are no statements, which makes the ternary operator pretty much superfluous. You can always replace

cond ? then_branch : else_branch

with

if cond then then_branch else else_branch end

So, in your example:

object.method ? a.action : nil

is equivalent to

if object.method then a.action end

which as @Greg Campbell points out is in turn equivalent to the trailing if modifier form

a.action if object.method

Also, since the boolean operators in Ruby not just return true or false, but the value of the last evaluated expression, you can use them for control flow. This is an idiom imported from Perl, and would look like this:

object.method and a.action

Solution 2 - Ruby

a.action if object.method?

Solution 3 - Ruby

Greg's answer is the best, but for the record, and even more than in C, expressions and statements are equivalent in Ruby, so besides a.action if o.m? you can also do things like:

object.method? && a.action

You can write (a; b; c) if d or even

(a
 b
 c
) if d

or for that matter: (x; y; z) ? (a; b c) : (d; e; f)

There is no situation in Ruby where only a single statement or expression is allowed...

Solution 4 - Ruby

result = (<expression> && <true value>) || <false value>

value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one' Explain: value == 1 && 'one' #=> returns last expression result, value is equals 1 so and section will be evaluated, and return 'one'.

value = 0 result = (value == 1 && 'one' ) || 'two' result #=> 'two'

Explain: value != 1 and 'and' expression will not be evaluated, but instad will be used 'or' expression and it returns 'two'

Solution 5 - Ruby

Another way this can be done on the same line is:

if object.method; a.action end

This is considered bad style by Rubocop because it uses a semicolon to terminate the expression, but I find it more readable in some conditions than tacking on the if statement at the end. It is easier to overlook an if statement at the end and I don't always want to return something if the condition isn't true(as you are forced into with a ternary operator).

You can also be a bit more verbose and rubocop friendly:

if object.method then a.action end

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRyanCacophonyView Question on Stackoverflow
Solution 1 - RubyJörg W MittagView Answer on Stackoverflow
Solution 2 - RubyGreg CampbellView Answer on Stackoverflow
Solution 3 - RubyDigitalRossView Answer on Stackoverflow
Solution 4 - RubyomakolegView Answer on Stackoverflow
Solution 5 - RubyAllisonView Answer on Stackoverflow