Skip to content

Instantly share code, notes, and snippets.

@caius
Created December 28, 2011 17:26
Show Gist options
  • Save caius/1528785 to your computer and use it in GitHub Desktop.
Save caius/1528785 to your computer and use it in GitHub Desktop.
def output name=((default=true); "caius")
puts "name: #{name.inspect}"
puts "default: #{default.inspect}"
end
output
# >> name: "caius"
# >> default: true
output "avdi"
# >> name: "avdi"
# >> default: nil
@ngauthier
Copy link

this is one of the weirdest ruby thing's I've ever seen. I love it.

xoxo @ngauthier

@caius
Copy link
Author

caius commented Dec 28, 2011

I love it too, because I can understand how ruby evaluates it (I think.) The default argument is evaluated as ruby, but in the same scope as the method, so setting local variables means they're set for the method as well. And the parenthesis make it one expression, which ruby is fine with. And then it uses the return value of that expression for the default value of the name variable.

@teoulas
Copy link

teoulas commented Dec 28, 2011

Wow, really interesting. Never thought about this use case, but kind of makes sense.

@avdi
Copy link

avdi commented Dec 28, 2011

Holy crap, look at all the forks! You've created a monster!

@toamitkumar
Copy link

@caius @avdi - what is the use case of this trick ?

@avdi
Copy link

avdi commented Dec 28, 2011

The only use case I can think of is lulz. I'd never let this through a code review.

@toamitkumar
Copy link

@avdi :) I was scratching if I would ever end up using this trick...

@ngauthier
Copy link

turbo lulz:

def x y=((return 'lol'); y)
  y
end

trololo @ngauthier

@ngauthier
Copy link

also

def x(y=(raise 'i <3 params')); y; end

@skanev
Copy link

skanev commented Dec 29, 2011

Don't forget:

def foo(something = (def foo(*); 'bar'; end)) 'qux' end

puts foo(10)  # qux
puts foo      # qux
puts foo(10)  # bar
puts foo      # bar

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment