Пример 1 без переопределения метода и без локальной переменной
class Foo
def initialize
@foo = 'foo'
end
def print_foo
print @foo
print self.foo
print foo
end
end
@ foo, self.foo и foo будут обращаться к переменной экземпляра @foo в методе экземпляра:
Foo.new.print_foo # => foofoofoo
Пример 2 с переопределением метода
class Foo
def initialize
@foo = 'foo'
end
def foo
return 'bar'
end
def print_foo
print @foo
print self.foo
print foo
end
end
@ foo получит доступ к переменной экземпляра, но self.foo и foo вызовут метод переопределения foo:
Foo.new.print_foo # => foobarbar
Пример 3 с переопределением метода и локальной переменной
class Foo
def initialize
@foo = 'foo'
end
def foo
return 'bar'
end
def print_foo
foo = 'baz'
print @foo
print self.foo
print foo
end
end
@ foo обращается к переменной экземпляра, self.foo обращается к методу переопределения, а foo обращается к локальной переменной:
Foo.new.print_foo # => foobarbaz