class Example
private
def example_test
puts 'Hello'
end
end
e = Example.new
e.example_test
Это, конечно, не сработает, потому что мы указали явный получатель - экземпляр Example (e
), и это противоречит "частному правилу".
Но я не могу понять, почему в Ruby нельзя сделать это:
class Foo
def public_m
self.private_m # <=
end
private
def private_m
puts 'Hello'
end
end
Foo.new.public_m
Текущий объект внутри определения метода public_m
(т.е. self
) является экземпляром Foo. Так почему же это запрещено? Чтобы исправить это, мне нужно изменить self.private_m
на private_m
. Но почему это отличается, а не self
экземпляр Foo внутри public_m
? И кто является получателем голосовой речи private_m
? Разве это не self
- на самом деле вы опускаете, потому что Ruby сделает это за вас (вызовет private_m на себе)?
Надеюсь, я не слишком смутил его, я все еще добрался до Руби.
EDIT:
Спасибо за все ответы. Объединив их все вместе, я смог (в конце концов) выявить очевидное (и не столь очевидное для кого-то, кто никогда не видел таких вещей, как Ruby): сам self
может быть
явный и неявный приемник, и это делает разницу. Таким образом, существует два правила, если вы хотите вызвать частный метод: self
должен быть неявным приемником, и что сам должен быть экземпляром текущего класса (Example
в этом случае), и это происходит только тогда, когда self if inside определение метода экземпляра во время выполнения этого метода). Пожалуйста, поправьте меня, если я ошибаюсь.
class Example
# self as an explicit receiver (will throw an error)
def explicit
self.some_private_method
end
# self as an implicit receiver (will be ok)
def implicit
some_private_method
end
private
def some_private_method; end
end
Example.new.implicit
Сообщение для всех, кто может найти этот вопрос во время трасс google: это может быть полезно - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby