5
\$\begingroup\$

This might be a bit silly because there are like a thousand ways to do this, but I'm struggling to come up with one that I like. I feel like this should fit in one line, but I don't like re-using read_attribute(:length) lots and I don't like the below because it's not that clear.

# returns a human-readable string in the format Xh Ym
def length
  # length stored in seconds
  len = read_attribute(:length)
  "#{(len/60/60).floor}h #{len.modulo(60*60)/60}m" unless len.nil?
end
\$\endgroup\$
6
\$\begingroup\$

In one line

def length
  (len = read_attribute(:length)) && "#{(len/60/60).floor}h #{len.modulo(60*60)/60}m"
end

If len == nil return nil, if not - second operand

\$\endgroup\$
4
\$\begingroup\$

One-liners are nice, but sometimes it's better just to split lines. For example:

def length
  if (len = read_attribute(:length))
    "#{(len/60/60).floor}h #{len.modulo(60*60)/60}m" 
  end
end

If you really like compact code that deals with nil values, you can work with the idea of maybe's ick:

def length
  read_attribute(:length).maybe { |len| "#{(len/60/60).floor}h #{len.modulo(60*60)/60}m" }
end
\$\endgroup\$
2
\$\begingroup\$

Assuming that len is an integer you won't need to use floor. You can do something like this

"#{len/3600}h #{(len/60) % 60}m" unless len.nil?
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.