Вопрос по ruby – Почему Ruby не позволяет мне указывать себя как получателя в приватном методе?

3

Рубин как объектно-ориентированный язык. Это означает, что какое бы сообщение я ни отправлял, я строго отправляю его на некоторый объект / экземпляр класса.

Пример:

 class Test
   def test1
    puts "I am in test1. A public method"
    self.test2
   end

   def test2
    puts "I am in test2. A public Method"
   end
 end

имеет смысл я называю методtest2 наself объект

Но я не могу этого сделать

  class Test
   def test1
    puts "I am in test1. A public method"
    self.test2 # Don't work
    test2 # works. (where is the object that I am calling this method on?)
   end

   private
   def test2
    puts "I am in test2. A private Method"
   end
 end

когдаtest2 являетсяpublic method Я могу позвонить наself (Достаточно справедливо, метод отправлен самому объекту). Но когдаtest2 являетсяprivate method Я не могу назвать это на себя. Так где же объект, на который я отправляю метод?

Но вы можете позвонитьtest2 безself. в обоих случаях. alexkv

Ваш Ответ

3   ответа
2

self означает текущий экземпляр объекта, в котором вы находитесь.

призваниеTest.new.test1 вернет что-то вроде#<Test:0x007fca9a8d7928>.
Это экземпляр объекта Test, который вы сейчас используете.

Определение метода как частного означает, что его можно использовать толькоinside текущий объект.
Когда используешьself.test2Вы выходите за пределы текущего объекта (вы получаете экземпляр) и вызываете метод.
Таким образом, вы вызываете закрытые методы, как если бы вы не находились в объекте, поэтому вы не можете.

Когда вы не указываетеselfВы остаетесь внутри текущего объекта.
Так что вы можете просто вызвать метод. Руби достаточно умен, чтобы знать, чтоtest2 это метод, а не переменная и вызывать его.

но тогда это выглядит слишком процедурным, чтобы просто написать имя метода без явного упоминания получателя. Bhushan Lodha
11
The Problem

directly с явным получателем; Здесь я не получаю особого отношения. По определению, когда вы звонитеself.some_method вы указываете себя как явного получателя, поэтому Руби говорит "Нет!"

The Solution

В Ruby есть правила поиска методов. Может быть более канонический источник для правил (кроме перехода к источнику Ruby), но этоСообщение блога выкладываете правила прямо вверху:

1) Methods defined in the object’s singleton class (i.e. the object itself)
2) Modules mixed into the singleton class in reverse order of inclusion
3) Methods defined by the object’s class
4) Modules included into the object’s class in reverse order of inclusion
5) Methods defined by the object’s superclass, i.e. inherited methods

Другими словами, частные методы сначала ищутся в себе без необходимости (или разрешения) явного получателя.

5

Это & APOS; sself, Когда вы не указываете получателя, получательself.

Определениеprivate в Ruby частные методы могут вызываться только без получателя, то есть с неявным получателемself, Интересно, что это вас совсем не беспокоилоputs метод, который также является частным методом экземпляра ;-)

Примечание: есть исключение из этого правила. Частные сеттерыcan вызываться с явным получателем, пока получательself, На самом деле ониmust вызываться с явным получателем, потому что в противном случае была бы неоднозначность с локальными назначениями переменных:

foo = :fortytwo      # local variable
self.foo = :fortytwo # setter
Нет, это не так. Попытайся.
Вы попробуйте. Вы увидите, что это работает как шарм!gist.github.com/2835861
В этом фрагменте нет частного установщика, и при этом нет установщика, вызываемого без явного получателя.
@ J & # xF6; rgWMittag - это "частный сеттер" поведение официально задокументировано? Я не смог его найти.
Это неправда. Если методfoo= существует,foo = :fortytwo вызовет сеттер.

Похожие вопросы