Well, I think the reason this is the case is because qwerty = 4
is ambiguous—are you defining a new variable called qwerty
or calling the setter? Ruby resolves this ambiguity by saying it will create a new variable, thus the self.
is required.
Here is another case where you need self.
:
class A
def test
4
end
def use_variable
test = 5
test
end
def use_method
test = 5
self.test
end
end
a = A.new
a.use_variable # returns 5
a.use_method # returns 4
As you can see, the access to test
is ambiguous, so the self.
is required.
Also, this is why the C# example is actually not a good comparison, because you define variables in a way that is unambiguous from using the setter. If you had defined a variable in C# that was the same name as the accessor, you would need to qualify calls to the accessor with this.
, just like the Ruby case.