В тексте, который вы цитируете, «не сам» означает не в том же контексте (объекте), что был сделан вызов.
В этом примере частного метода ...
class Foo
def bar
baz
end
private
def baz
'hello'
end
end
Если вы сделаете
Foo.new.baz
Вы получите ошибку, потому что baz
был вызван с явным получателем (часть перед точкой ... Foo.new
)
ЕслиВы делаете
Foo.new.bar
=> "hello"
И это работает, потому что метод bar
вызывает baz
без получателя.Он мог вызывать его без получателя, поскольку bar
(например, baz
) оба являются методами экземпляра объекта Foo
, поэтому они имеют одинаковый контекст (одинаковый self
).метод bar
вызывал baz
для того же объекта, который содержит метод bar
(т. е. «себя» или «себя», если вы думаете, что вы сидите в объекте, когда пишете методы объекта).
Теперь переписайте класс как ...
class Foo
def bar
self.baz
end
private
def baz
'hello'
end
end
И теперь вы видите, что bar
больше не работает, поскольку вы привели получателя self
(явного получателя) к вызовуbaz
в рамках метода bar
.Технически такая же функциональность (ни один получатель не совпадает с self как получатель), но Ruby реализует закрытые методы, запрещая явные получатели, даже self
.Итак, как уже говорилось, частные методы нельзя вызывать с явным получателем.
Каждый раз, когда вы вызываете метод для объекта, вы не вызываете этот метод для себя (то есть для своего контекста).
'george'.upcase
=> "GEORGE"
Для upcase
явный получатель - это часть перед точкой (строковый объект "george")
Если вы сделали
upcase
без указания получателя, этопредполагается, что вы хотите запустить upcase
в своем контексте (self
), который в IRB является основным: Object.Вот почему вы получаете
NameError: undefined lcoal variable or method `upcase' for main:Object