Написание Ruby библиотек - скрытие методов за пределами модуля - PullRequest
4 голосов
/ 24 мая 2010

Я пишу библиотеку Ruby, в которой есть модуль с кучей классов внутри. Многие из этих классов должны быть применимы и модифицируемы путем вызова скриптов, но я не хочу (некоторые из) инициализаторов быть видимыми / вызываемыми:

module MyLib
  class Control
    def initialize
      # They can use this
    end

    def do_stuff
      Helper.new('things')
    end
  end

  class Helper
    # Shouldn't be visible 
    def initialize(what)
      @what = what
    end

    def shout
      @what
    end
  end
end

c = MyLib::Control.new
h = c.do_stuff
p h.shout
# => "things"
# ^ All of this is desired

# v This is undesirable
p MyLib::Helper.new('!')
# => <MyLib::Helper @what='!'>

Если это просто, то я также был бы признателен за то, что сгенерированный RDoc даже не включает метод .new для класса Helper. Есть идеи?

Спасибо за чтение!

Ответы [ 2 ]

3 голосов
/ 24 мая 2010

Мой первоначальный ответ был совершенно неверным, как указывал @Matthew. Но есть и другие обходные пути. Например, вы можете назначить анонимный класс переменной класса в Control и по-прежнему определять методы как обычно, используя class_eval:

module MyLib
  class Control
    def initialize
    end

    def do_stuff
      @@helper.new('things')
    end

    @@helper = Class.new
    @@helper.class_eval do
      def initialize(what)
        @what = what
      end

      def shout
        @what
      end
    end
  end
end

Фрагмент

c = MyLib::Control.new
h = c.do_stuff
p h.shout

все еще пишет "things", но теперь нет доступа к @@helper, кроме как через переменную класса. Если кто-то действительно хочет получить к нему доступ, то после того, как я снова открою класс Control или воспользуюсь class_eval, ничто не остановит его, но с динамическим языком вам придется иметь дело с этим.

Я решил присвоить анонимный класс переменной класса, чтобы он создавался только один раз; но если вам не нужно переопределять анонимный класс много раз, нет причины, по которой он не может быть переменной экземпляра.

2 голосов
/ 24 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...