“...I've been working since 2008 with Ruby / Ruby on Rails, love a bit of Elixir / Phoenix and learning Rust. I also poke through other people's code and make PRs for OpenSource Ruby projects that sometimes make it. Currently working for InPay who are based in Denmark...”

Rob Lacey
Senior Software Engineer, Copenhagen, Denmark

Keep your method to yourself with define_singleton_method

So define_singleton_method is quite cool.

Angel = Class.new do
  def dreaming_of_an
    whatever
  end
end

This is going to fail, whatever is not defined.

Angel.new.dreaming_of_an
(irb):3:in `dreaming_of_an': undefined local variable or method `whatever' for #<Angel:0x0000000107045b98> (NameError)

I can define whatever outside of the object itself.

Angel.new.tap { def whatever; 'aaaaaangel--iiii'; end }.dreaming_of_an
=> "aaaaaangel--iiii"

But what if I define this method directly on the instance

Angel.new.tap { def _1.whatever; 'aaaaaangel'; end }.dreaming_of_an
=> "aaaaaangel"

This seems cleaner

Angel.new.tap { _1.define_singleton_method(:whatever) { 'aaaaaangel' } }.dreaming_of_an
=> "aaaaaangel"

For bonus points, the method lookup fails for _2 because the second argument is nil and it defaults to the global method

irb(main):012> Angel.new.tap { def _1.whatever; 'aaaaaangel'; end }.dreaming_of_an
=> "aaaaaangel"
irb(main):013> Angel.new.tap { def _2.whatever; 'aaaaaangel'; end }.dreaming_of_an
=> "aaaaaangel--iiii"

However, we did manage to assign a singleton method on nil…which is fun.

nil.whatever
=> "aaaaaangel"