Ruby: вызов приватных методов изнутри с помощью ключевого слова self

class MyClass
  def test
    puts my_id
    puts self.my_id
  end

  private

  def my_id
    115
  end
end

m = MyClass.new
m.test

Этот скрипт приводит к выводу:

115
priv.rb:4:in `test': private method `my_id' called for #<MyClass:0x2a50b68> (NoMethodError)
    from priv.rb:15:in `<main>'

В чем разница между вызовом методов изнутри с ключевым словом self и без него?

Из моего опыта работы с Delphi и C#: не было никакой разницы, и self можно было использовать, чтобы избежать конфликта имен с локальной переменной, чтобы обозначить, что я хочу вызвать функцию экземпляра или обратиться к переменной экземпляра.


person Paul    schedule 22.08.2014    source источник
comment
возможный дубликат Понимание частных методов в Ruby   -  person Matt    schedule 22.08.2014


Ответы (1)


В ruby ​​метод private — это просто метод, который нельзя вызвать с явным получателем, т. е. с чем-либо слева от ., для self не делается никаких исключений, за исключением случаев методов установки (методы, имя которых заканчивается на =)

Чтобы устранить неоднозначность вызова метода, отличного от установки, вы также можете использовать скобки, т.е.

my_id()

Для метода частного сеттера, т.е. если бы у вас был

def my_id=(val)
end

тогда вы не можете заставить ruby ​​разобрать это как вызов метода, добавив скобки. Вы должны использовать self.my_id= для ruby, чтобы проанализировать это как вызов метода - это исключение из "вы не можете вызывать методы установки с явным получателем"

person Frederick Cheung    schedule 22.08.2014
comment
Есть одно исключение: вы можете вызывать приватные сеттеры с явным self - person Stefan; 22.08.2014
comment
Так что вы можете - не думал попробовать это! - person Frederick Cheung; 22.08.2014
comment
@Stefan, я думаю, что это может быть необходимо по той же причине, по которой публичный сеттер должен вызываться с помощью self. - person Cary Swoveland; 22.08.2014
comment
@CarySwoveland прав. Скорее, это должно быть так: вы не можете вызывать частный сеттер без self, потому что в противном случае это будет интерпретироваться как присвоение локальной переменной. - person Jörg W Mittag; 23.08.2014
comment
Это было довольно плохо сформулировано от моего имени - после того, как Стефан указал, что наш я неуклюже пытался сказать, что вы не можете использовать скобки в этом случае - предположительно, это мотивация отклонения от общего определения частного. - person Frederick Cheung; 23.08.2014