views:

233

answers:

4

Currently I have:

file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1)

Which works fine, but doesn't look good. What is a better way to write this in ruby so that I am checking for nil and not concatenating it

Note: This question is similar to a LOT of questions, but in no such way is it anything of a duplicate. This question is about string concatenation and writing better code less than it is for checking nil/zero.

+18  A: 

You can do this:

file.puts "cn: " + (var1 || "UNKNOWN")

or, identically if you prefer:

file.puts "cn: " + (var1 or "UNKNOWN")

or my favourite, which I think is the most idiomatic ruby:

file.puts "cn: #{var1 or 'unknown'}"
Peter
if var1 is `false`, you'll see 'unknown' instead.
glenn jackman
+1  A: 
file.puts( "cn:" + (var1 || "UNKNOWN" ))
Farrel
+3  A: 

I would do what Peter suggested, assuming that false wasn't a valid value for var1, and var1 was guaranteed to be nil or a string. You could also extract that logic into a function:

def display_value(var)
  (var || "UNKNOWN").to_s # or (var.nil? ? "UNKNOWN" : var.to_s) if 'false' is a valid value
end

file.puts "cn: " + display_value(var1)

to_s is only necessary if var1 isn't guaranteed to be nil or a string. Alternatively, if you do:

file.puts "cn: #{display_value(var1)}"

it will do an implicit to_s on the result of display_value

Brad G.
A: 

Bumping this old question because I feel I have a bit to add.

Since the "cn: " part is purely aesthetical and therefore (more?) subject to change to meet future presentation guidelines, I would recommend using join;

file.puts(["cn", (var1 || "UNKNOWN")].join(": ")

Perhaps as a function, as mentioned earlier - semantics are the same, only method names/keywords have changed;

def value_or_unknown(value, attribute = nil)
  [attribute, (value or "UNKNOWN")] * ": "
end
Zach