class Example private def example_test puts 'Hello' end end e = Example.new e.example_test
Это, конечно, не сработает, потому что мы явно указали получатель - экземпляр примера (
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
? Разве это нея
- то, что на самом деле вы опускаете, потому что, Ruby сделает это за вас (вызовет private_m для себя)?Надеюсь, я не слишком его запутал, я все еще новичок в Ruby.
РЕДАКТИРОВАТЬ: Спасибо за все ответы. Собрав их все вместе, я смог (наконец) ощутить очевидное (и не столь очевидное для тех, кто никогда не видел таких вещей, как Руби): что
я
само по себе может быть явный и неявный получатель, и это имеет значение. Итак, есть два правила, если вы хотите вызвать частный метод:self
должен быть неявным получателем, и этот self должен быть экземпляром текущего класса (Пример
в этом случае - и это происходит только в случае self, если внутри определения метода экземпляра, во время выполнения этого метода). Пожалуйста, поправьте меня, если я ошибаюсь.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