Пример кода для дампа объекта и его свойств может быть найден здесь:
Когда бы вы ни захотели вызвать метод установки для себя, вы должны написать self.foo = bar. Если вы просто напишете foo = bar, синтаксический анализатор ruby распознает это как присвоение переменной и теперь будет думать о foo как о локальной переменной. Чтобы синтаксический анализатор понял, что вы хотите вызвать метод установки, а не назначать локальную переменную, вы должны написать obj.foo = bar, поэтому, если объект является самим собой, self.foo = bar
Вы устраняете неоднозначность между именем метода экземпляра и локальной переменной, используя self (разрешено иметь и то, и другое с одинаковым именем в одной области). Другими словами, разрешение имени метода будет только в том случае, если в области нет локальной или блочной переменной с тем же именем. Вот:
class Foo
attr_accessor :boo
def do_boo
boo = 123
puts "Locvar: #{boo} Method: #{self.boo}"
end
end
Foo.new.do_boo
Вот почему: представьте, что у вас есть модуль, реализующий метод. Этот метод присваивает что-то своей внутренней локальной переменной разрешение имени метода будет только в том случае, если в области нет локальной или блочной переменной с тем же именем. Вот:
class Foo
attr_accessor :boo
def do_boo
boo = 123
puts "Locvar: #{boo} Method: #{self.boo}"
end
end
Foo.new.do_boo
Вот почему: представьте, что у вас есть модуль, реализующий метод. Этот метод присваивает что-то своей внутренней локальной переменной разрешение имени метода будет только в том случае, если в области нет локальной или блочной переменной с тем же именем. Вот:
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 #, потому что простое выражение «класс» означает класс ключевое слово для Ruby.