Понимание частных методов в классе Ruby

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

49
задан Andrew Grimm 27 March 2012 в 12:07
поделиться