20

最近、 goliathやミドルウェアなどにuse関連するコードを調べていたときに、Ruby のコードで ,という言葉をたまたま目にしました。includeextendrequire

useこのキーワードが存在する理由と、 include/との違いを誰かが説明できますかrequire? どのように機能し、いつ使用するのですか?

4

1 に答える 1

33

ドキュメンテーション

人々が指摘したように、useは Ruby のキーワードではなく、実際にはRack::Builderクラスのメソッドです。

use(middleware, *args, &block)

スタックで使用するミドルウェアを指定します。

このドキュメント@ user166390 が指摘)は、次のように説明しています。

Rack::Builderアプリケーションを繰り返し構築するための小さな DSL を実装しRackます。

例:

app = Rack::Builder.new {
  use Rack::CommonLogger
  use Rack::ShowExceptions
  map "/lobster" do
    use Rack::Lint
    run Rack::Lobster.new
  end
}

または

app = Rack::Builder.app do
  use Rack::CommonLogger
  lambda { |env| [200, {'Content-Type' => 'text/plain'}, 'OK'] }
end

useミドルウェアをスタックに追加runし、アプリケーションにディスパッチします。

ソースコード

Rack::Builderソースコードにはあまり詳しくありませんが、新しいミドルウェアモジュールを呼び出すたびuseに、配列に追加され、各モジュールが追加されたときと逆の順序で実行/挿入されるようです (最後の-in-first-out オーダー、別名スタック オーダー)。前のミドルウェアを実行した結果は、次の経由でスタック内の次のミドルウェアに渡されますinject

  1. 53 ~ 56 行目:

    def initialize(default_app = nil,&block)
      # @use is parallel assigned to [].
      @use, @map, @run = [], nil, default_app
      instance_eval(&block) if block_given?
    end
    
  2. 81 ~ 87 行目:

    def use(middleware, *args, &block)
      if @map
        mapping, @map = @map, nil
        @use << proc { |app| generate_map app, mapping }
      end
      # The new middleware is added to the @use array.
      @use << proc { |app| middleware.new(app, *args, &block) }
    end
    
  3. 131 ~ 135 行目:

    def to_app
      app = @map ? generate_map(@run, @map) : @run
      fail "missing run or map statement" unless app
      # The middlewares are injected in reverse order.
      @use.reverse.inject(app) { |a,e| e[a] }
    end
    

その他のリソース

  1. ラックの簡単な紹介
  2. Ruby on Rack #2 - ビルダー.
于 2014-03-07T08:42:12.793 に答える