Can anyone explain the difference between accessing an instance attribute via self.attribute
and by @attribute
?
Asked
Active
Viewed 1.2k times
80

sawa
- 165,429
- 45
- 277
- 381

pistacchio
- 56,889
- 107
- 278
- 420
2 Answers
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
-
14Note 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
-
6One 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
-
1The link is broken. This one works: https://www.greyblake.com/blog/2012-09-01-ruby-perfomance-tricks/ – nbkhope Mar 09 '20 at 16:06