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.