Live data from Hacker News

Ruby’s Most Underused Keyword

rubyrailways.com

1–10 of 13 posts

Re: Ruby’s Most Underused Keyword

#3
My personal up until recently underused keyword was (surprise!) "rescue".

I'm not sure how this has been escaping me since 07, but I had no idea you can apply it at the end of an expression, i.e. when you're facing nasty functions that insist on trhowing exceptions, instead of

begin

  value = function_that_throws
rescue

  value = "default"
end

you can just write:

value = function_that_throws rescue "default"

Re: Ruby’s Most Underused Keyword

#4

My personal up until recently underused keyword was (surprise!) "rescue". I'm not sure how this has been escaping me since 07, but I had no idea you can apply it at the end of an expression, i.e. when you're facing nasty functions that insist on trhowing exceptions, instead of begin value = function_that_throws rescue value = "default" end you can just write: value = function_that_throws rescue "default"

Cool, sure, but blind rescues are as the crow flies to bugs: use them wisely, or use them _why-ly.

Re: Ruby’s Most Underused Keyword

#5

My personal up until recently underused keyword was (surprise!) "rescue". I'm not sure how this has been escaping me since 07, but I had no idea you can apply it at the end of an expression, i.e. when you're facing nasty functions that insist on trhowing exceptions, instead of begin value = function_that_throws rescue value = "default" end you can just write: value = function_that_throws rescue "default"

that's along the lines of using or for nil returns.

value = function_that_nils || "default"

I've found it makes code more succinct.

Re: Ruby’s Most Underused Keyword

#6
post #5

My personal up until recently underused keyword was (surprise!) "rescue". I'm not sure how this has been escaping me since 07, but I had no idea you can apply it at the end of an expression, i.e. when you're facing nasty functions that insist on trhowing exceptions, instead of begin value = function_that_throws rescue value = "default" end you can just write: value = function_that_throws rescue "default"

that's along the lines of using or for nil returns. value = function_that_nils || "default" I've found it makes code more succinct.

Careful here: I've seen plenty of "Rubiomatic" bugs that look like this:

value = function_that_nils or "default"

... which results in nil assignment to value. Accidental confusion between || and 'or' is very common in Ruby world IMO, almost like famous == vs = in C.

Re: Ruby’s Most Underused Keyword

#8
redo, in the Fibonacci example, is still iterative - it's presented as a third way, when it's just a cruftier way of being iterative. If you remove the cruft of the lambda and the redo, you end up with:

  def fib(i)
    n, result = 1, 0
    while i != -1
      i, n, result = i - 1, n + result, n
    end
    result
  end
Cleaner, faster (by 10% on Ruby 1.8) and shorter, but certainly iterative.

(Separate to this, the fib routines shown produce incorrect results - my example above maintains this, just for comparison with the original code. fib(10) is 55 not 89 - it's one off in its input.)

Re: Ruby’s Most Underused Keyword

#9
post #5

Earlier quoted context omitted.

that's along the lines of using or for nil returns. value = function_that_nils || "default" I've found it makes code more succinct.

Careful here: I've seen plenty of "Rubiomatic" bugs that look like this: value = function_that_nils or "default" ... which results in nil assignment to value. Accidental confusion between || and 'or' is very common in Ruby world IMO, almost like famous == vs = in C.

Agreed. I think one is for statements (or) and the other one is for expressions (||), so they have different operational precedence, even though you could use them interchangeably, as long as you knew what got executed first.

Re: Ruby’s Most Underused Keyword

#10

redo, in the Fibonacci example, is still iterative - it's presented as a third way, when it's just a cruftier way of being iterative. If you remove the cruft of the lambda and the redo, you end up with: def fib(i) n, result = 1, 0 while i != -1 i, n, result = i - 1, n + result, n end result end Cleaner, faster (by 10% on Ruby 1.8) and shorter, but certainly iterative. (Separate to this, the fib routines shown produce…

You are absolutely right... if you're an interpreter...

From a user's point of view, the redo says "run this block again"; and since the block == the method it's just another way to run acc(). Of course, it's still faking, but I've never claimed anything else :-)

Post reply on HN