Вы устраняете неоднозначность между именем метода экземпляра и локальной переменной, используя self (разрешено иметь оба одинаковых имени в одной и той же области видимости). Другими словами, разрешение имени метода будет иметь место только в том случае, если в области нет локальной или блочной переменной с тем же именем. Вот:
class Foo
attr_accessor :boo
def do_boo
boo = 123
puts "Locvar: #{boo} Method: #{self.boo}"
end
end
Foo.new.do_boo
И вот почему: представьте, что у вас есть модуль, который реализует метод. Этот метод присваивает что-то своей внутренней локальной переменной
«foo», который используется для некоторых вычислений. Если вы пропустите часть «self», метод вызовет метод «foo =» для объекта.
чей класс включает модуль, который не был намерением автора и может быть совершенно катастрофическим.
class Foo
def bar=(new_value_of_bar)
set_off_nukes(new_value_of_bar / 3)
end
end
module InnocentModule # written by a different author elsewhere
def do_useful_stuff
...
bar = Math.sin(something) # we're dead
end
end
Foo.send(:include, InnocentModule)
Другая важная часть, где вы должны использовать self, - это вызов метода Object # class, потому что просто сказать «class» означает ключевое слово class для Ruby.