Новые экземпляры из методов экземпляров, когда Class.new является закрытым - PullRequest
1 голос
/ 15 февраля 2012

У меня есть класс, чей метод new был закрыт, потому что я хочу, чтобы только мои "конструкторы" метода класса создавали новые экземпляры. Однако теперь мне нужно, чтобы некоторые методы экземпляров тоже создавали новые экземпляры.

Например, посмотрите на следующий фрагмент. Это в method_a, где у меня проблемы:

Class Foo

  class << self

    #a "constructor" method
    def from_x arg
      stuff_from_arg = arg.something #something meaningful from arg
      new(stuff_from_arg)
    end
  end

  def initialize stuff
    @stuff = stuff
  end

  private_class_method :new #forces use of Foo.from_x

  def method_a
    other_stuff = "blah"
    #These do not work
    return new(blah) #nope, instance cannot see class method
    return self.class.new(blah) #nope, new is private_class_method
    return Foo.new(blah) #same as previous line
    return initialize(blah) #See *, but still doesn't work as expected
  end
end

Я начинаю думать, что я, возможно, спроектировал этот класс таким образом, что мне нужно создать другой метод конструктора класса для создания нового Foo, например:

#in addition to previous code
Class Foo
  class << self
    def just_like_new stuff
      new(stuff)
    end
  end
end

Это не очень правильно и не очень СУХО, но, возможно, это кровать, которую я для себя сделал. Я могу что-нибудь сделать?

* Эта строка была немного удивительной. Возвращает blah. Помимо определения класса, есть также initialize, который принимает 0 аргументов и возвращает nil Кто-нибудь знает, что здесь происходит?

1 Ответ

1 голос
/ 15 февраля 2012

Вы всегда можете использовать send, чтобы обойти контроль доступа:

def from_x arg
  stuff_from_arg = arg.something #something meaningful from arg
  self.class.send(:new, stuff_from_arg)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...