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"

ここに別の良い説明があります

于 2012-11-12T21:16:40.597 に答える