29

可能我错过了一些简单的东西,但我不明白如何使用 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

4

1 回答 1

22

如果您想要一个对象既具有自己的行为又在其生命周期内委托给不同的对象时,请使用子类 SimpleDelegator。

本质上说,当您创建的类不会获得不同的对象时,请使用 DelegateClass。 Ruby 中的TempFile只是用来装饰一个 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

于 2012-11-12T21:16:40.597 回答