Подтвердить что ты не робот

Когда использовать Ruby DelegateClass вместо SimpleDelegator? (Метод DelegateClass и класс SimpleDelegator)

Возможно, я пропустил что-то простое, но я не понимаю, как использовать метод Ruby DelegateClass, я имею в виду, когда его использовать класса SimpleDelegator. Например, все следующие, похоже, работают в основном идентично:

require 'delegate'

a = SimpleDelegator.new([0])
b = DelegateClass(Array).new([0])
c = DelegateClass(String).new([0])
a << 1
b << 2
c << 3
p a # => [0, 1]
p b # => [0, 2]
p c # => [0, 3]

Обратите внимание, что не имеет значения, какой класс передан в DelegateClass.

4b9b3361

Ответ 1

Использовать подкласс SimpleDelegator, если вы хотите, чтобы объект имел свое поведение и делегировал разные объекты в течение его жизни.

По сути говоря, использование DelegateClass, когда класс, который вы создаете, не будет получать другой объект. TempFile в Ruby будет только украшать объект File SimpleDelegator может быть повторно использован для разных объектов.

Пример:

require 'delegate'


class TicketSeller
  def sellTicket()
    'Here is a ticket'
  end
end


class NoTicketSeller
  def sellTicket()
    'Sorry-come back tomorrow'
  end
end


class TicketOffice < SimpleDelegator
  def initialize
    @seller = TicketSeller.new
    @noseller = NoTicketSeller.new
    super(@seller)
  end
  def allowSales(allow = true)
    __setobj__(allow ? @seller : @noseller)
    allow
  end
end

to = TicketOffice.new
to.sellTicket   »   "Here is a ticket"
to.allowSales(false)    »   false
to.sellTicket   »   "Sorry-come back tomorrow"
to.allowSales(true)     »   true
to.sellTicket   »   "Here is a ticket"

Вот еще одно хорошее объяснение a-delegate-matter