80

Can anyone explain the difference between accessing an instance attribute via self.attribute and by @attribute?

sawa
  • 165,429
  • 45
  • 277
  • 381
pistacchio
  • 56,889
  • 107
  • 278
  • 420

2 Answers2

99

self.attribute calls the method attribute.
self.attribute = value calls the method attribute= with the argument value.
@attribute and @attribute = value get/set the value of the instance variable @attribute.

So basically they're two entirely different things.

However if you call attr_accessor :attribute it defines the method attribute to return @attribute and the method attribute=(value) to set @attribute = value. So in that case, there is no difference.

Peter Lang
  • 54,264
  • 27
  • 148
  • 161
sepp2k
  • 363,768
  • 54
  • 674
  • 675
  • 14
    Note that it is generally recommended to use `self.` (unless you're writing the getter/setter method) even if you _currently_ have `attr_accessor`. This protects you from additional refactor work and bugs if you later change the accessor method(s) to do more than just get/set the instance variable. (Or if someone else patches or subclasses your work.) – Phrogz Jan 09 '11 at 15:03
  • 6
    One of the bugs Phrogz is talking about is if you simply call attribute = _____ instead of self.attribute = ______ you are setting a local variable instead of the instance variable. – Jason Noble Apr 04 '12 at 05:48
3

"Accessing instance variable directly is about two times faster than accessing them with accessor methods"

Check out the: https://www.greyblake.com/blog/2012-09-01-ruby-perfomance-tricks/

meso_2600
  • 1,940
  • 5
  • 25
  • 50
  • 1
    The link is broken. This one works: https://www.greyblake.com/blog/2012-09-01-ruby-perfomance-tricks/ – nbkhope Mar 09 '20 at 16:06