Jason Kim
Jason Kim

Reputation: 19031

"Ruby-esque" if else conditional statements

I'm currently reading The Ruby Programming Language, and I am not sure how to read Ruby-esque if else statements properly. Can you help me write the ruby code below in the second code block in regular if-else statements like this?

if some_condition
  return x
else
  return y
end

So the ruby codes I am unsure of are these.

minimum = if x < y then x else y end

max = x > y ? x : y  

Thank you!

Upvotes: 2

Views: 1235

Answers (1)

andrewdotnich
andrewdotnich

Reputation: 16784

Both of the forms you seem to be having difficulty with make use of an idea Ruby takes from the Functional Programming paradigm: namely, Everything is an expression, and therefore returns a value. This is even true for conditional statements, an idea that languages like Java don't really support (for example:

public boolean test() {
  boolean x = if (1 > 2 ) { false; } else { true; };
  return x;
}

simply isn't syntactically valid).

You can see this in a Ruby terminal:

will_be_assigned_nil = false if (1 > 2) # => nil
will_be_assigned_nil # => nil

So, to your question. The first one can be rewritten like this:

if x < y
  mininum = x
else
  minimum = y
end

The second is like the ternary operator in other languages, and is equivalent to:

if x > y
  max = x
else
  max = y
end

It's helpful to remember the roots & heritage of languages when trying to understand their constructs. Ruby shares the "More Than One Way To Do It" philosophy with Perl, and idiomatic Ruby code often has a high emphasis on elegance.

The "post-expression"-style conditionals are a good example of this. If I have guard expressions at the start of my methods, it's not uncommon for me to write:

raise "Pre-condition x not met" unless x # (or "if !x" , preference thing)
raise "Pre-condition y not met" unless y # etc., etc.

instead of

if !x
  raise "Pre-condition x not met"
end
if !y
  raise "Pre-condition y not met"
end

Upvotes: 7

Related Questions