🕷 zenspider.com

by ryan davis

Looking for the Ruby Quickref?

Crazy Singleton Methods

Published 2008-10-17 @ 14:45

Tagged ruby, thoughts

So, just about everyone knows about singleton methods… it means you can attach a method to a single individual object. Most often this is used for class methods:

  class Person
    def self.people
      # return all people

Which is fine, but you can also do things to any old instance:

  a = "string!"
  def a.inspect
  p a
  # => :symbol!

What I didn’t know and learned while working on ruby_parser is that there is another kind of singleton. The above singleton is a variable-based singleton. It requires a variable as the target for the singleton definition.

For example, you can’t do this:

  a = Object.new
  class Object ; def b; end end
  def a.b.x ; 42; end
  SyntaxError: compile error
  (irb):8: syntax error, unexpected '.', expecting '\n' or ';'
  def a.b.x ; 42; end
  (irb):8: syntax error, unexpected kEND, expecting $end

BUT! Looking at the grammar, you can do singletons w/ any expression by using parenthesis! Here is an expression-based singleton:

  def (a.b).x ; 42; end
  # => 42

Now, the above example is crap… but maybe you’d want to do something like:

  class Agent
    @@tasks = []
    def self.spawn
      t = Task.new
      @@tasks << t
  def (Agent.spawn).task
    puts "YAY!"

No… I still can’t see why you’d want to… but you can.