0

Thread.currentこのコードの目的は何ですか? Rails アプリケーションで DCI を使用するこの例を見ています。lib/context.rb には、次のようなものがあります。

module Context
  include ContextAccessor

  def context=(ctx)
    Thread.current[:context] = ctx
  end

  def in_context
    old_context = self.context
    self.context = self
    res = yield
    self.context = old_context
    res
  end
end

app/contexts のさまざまなコンテキストで使用されます。例:

def bid
  in_context do
    validator.validate
    biddable.create_bid
  end
  #...
end

ブロックでコードを実行in_contextし、現在のスレッドでキーと値のペアを設定する利点は何ですか?

4

2 に答える 2

2

Thread.current各スレッドが独自のコンテキストを持つ複数のスレッド化アプリケーションをサポートするために必要です。

コンテキストを取得するContextAccessorモジュールも含まれています。それらをまとめると、より明確な図が得られます。

# context.rb
def context=(ctx)
  Thread.current[:context] = ctx
end

# context_accessor.rb
def context
  Thread.current[:context]
end

このin_contextメソッドは、ブロック内のコンテキストを安全に変更できるように設計されています。変更が何であれ、ブロックの実行が終了すると、古いコンテキストが復元されます。

于 2015-09-02T08:24:17.193 に答える