Talking to Yourself Is Bad, mmkay?

October 20, 2008 · 1 min read

A lot of languages encourage talking to yourself. OO PHP code is sprinkled with $this->foo_method();. In some languages it’s necessary. Ruby isn’t one of them.

class Foo
  def bar
    # Why are you talking to yourself?!
    @thingy = self.foo
  end

  def foo
    "QUUX!"
  end
end

That self. is doing absolutely nothing. You can drop it entirely:

class Foo
  def bar
    @thingy = foo
  end

  def foo
    "QUUX!"
  end
end

This is a trivial example, but it makes a real difference across a larger codebase. Less noise, easier to read, fewer characters to trip over. Give it a try – your code will look less like it’s having a conversation with itself.

There’s one caveat though: you do need self when calling a setter method. Without it, Ruby thinks you’re assigning to a local variable:

class Foo
  attr_accessor :thingy

  def bar
    # This assigns to a local variable, NOT the attribute.
    thingy = foo
  end

  def foo
    "QUUX!"
  end
end
class Foo
  attr_accessor :thingy

  def bar
    # This calls Foo#thingy= as intended.
    self.thingy = foo
  end

  def foo
    "QUUX!"
  end
end

So the rule is simple: skip self for reading, keep it for writing. Your future self (pun intended) will thank you.

These posts are LLM-aided. Backbone, original writing, and structure by Craig. Research and editing by Craig + LLM. Proof-reading by Craig.