Как получить доступ к защищенным методам класса из методов экземпляра в Ruby? - PullRequest
6 голосов
/ 02 ноября 2011

Я, должно быть, что-то упускаю из-за того, как люди делают это в Ruby.

Если «#protected» не закомментировано, мы получаем:в 'what': защищенный метод 'zoop' вызвал Foo: Class (NoMethodError)

Есть ли лучший способ приблизиться к методам защищенного класса?

class Foo
  class << self
    #protected
    def zoop 
      "zoop"
    end
  end
  public
  def what
    "it is '#{self.class.zoop}'"
  end
  protected
end

a = Foo.new
p a.what # => "it is 'zoop'"

Я бы хотел, чтобы zoop былзащищенный или частный (без вызова 'Foo.zoop'), но пока я не могу найти элегантный способ.

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

После дальнейших обсуждений с rue: и drbrain: в ruby-lang выясняется, что мой импульс к экономии памяти путем размещения служебных функций на уровне класса был неуместен.

В Ruby методы экземпляра зависаютвне зависимости от класса, и ответ заключается в том, чтобы пойти дальше и поместить служебные функции на уровне экземпляра как частные.

Таким образом, вспомогательная функция, доступ к которой осуществляется только методами экземпляра:

class Foo
  def what
    "it is '#{zoop}'"
  end
  private
  def zoop
    "zoop"
  end
end

p Foo.new.what # => "it is 'zoop'"

Для вспомогательной функции, которую необходимо вызывать из методов экземпляра и класса, вложенный модуль казался популярным подходом:

class Foo
  module Util
    def self.zoop
      "zoop"
    end
  end
  def what
    "it is '#{Util.zoop}'"
  end
  class << self
    def class_what
      "for all time it is '#{Util.zoop}'"
    end
  end
end

p Foo.new.what   # => "it is 'zoop'"
p Foo.class_what # => "for all time it is 'zoop'"
p Foo::Util.zoop # visible, alas
2 голосов
/ 02 ноября 2011

Едва ли важно делать методы частными или защищенными в Ruby, поскольку вы можете просто вызвать send (), чтобы обойти их.

Если вы хотите, чтобы zoop оставался защищенным, используйте send () следующим образом:

def what
  "it is '#{self.class.send(:zoop)}'"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...