Normally, if you have a private method, you can’t call it with an explicit receiver, even if that receiver is
self. So you can’t say
def foo self.bar # explicit receiver end private def bar 123 end
foo needs to call simply
bar, leaving the
def foo bar # implicit receiver end
However, when you call setters, you always need an explicit receiver, or you’ll just assign a local variable:
def assign_things self.a = 123 b = 456 end def a=(v) puts "This one gets called." end def b=(v) raise "This one never does; the other method makes a local called `b` instead." end
So, what do you do if you have a private setter? You call it with an explicit receiver:
def assign_things self.a = 123 end private def a=(v) puts "This is called successfully." end
There’s a crazy special exception in Ruby that lets you use an explicit receiver of
self with a setter just so that you can call private setters.
This strikes me as weird. Why can’t you call any private method explicitly on self? I thought it was just easier to implement Ruby if you couldn’t, but if they made it work for setters, I’m not sure what the big deal is.
About the Author
BiographyMore Content by Pivotal Labs