hardscrabble

Fun method names in Ruby

08 Jun 2016

One thing I like about Ruby is that you can use a little punctuation in your method names, which can help you write expressions that read like nice sentences:

delete_user user unless user.special?

Kind of fun.

I knew a guy who liked to use these question mark methods in conjunction with the ternary operator to write code that reads like a panicked friend:

user.special?? protect(user) : delete(user)

The double question mark always makes me smile, which makes me wonder… Can I just define a method with double question marks right in the method signature? Like this:

class User
  def special??
    name == 'Max'
  end
end

Turns out: nope. That’s a syntax error. Not valid Ruby code.

Well… OK. But this is Ruby, so there’s not just one way to do a thing. There’s another way to define a method… Let’s try this:

class User
  def initialize(name)
    @name = name
  end

  define_method("special??") do
    @name == 'Max'
  end

  define_method("multi
                line
                method
                name??") do
    puts "sure, why not?"
  end

  define_method("!?") do
    "‼"
  end
end

user = User.new("Max")
user.public_send("special??") #=> true
user.public_send("!?") #=> "‼"
user.public_methods(false) #=> [:"special??", :"multi\n                line\n                method\n                name??", :"!?"]

Haha that works!

OK it’s not as satisfying calling the methods with public_send, but as far as I know, it’s the only syntactically-correct way to call these methods.