0
> %w(action_controller/railtie action_mailer/railtie).map &method(:require)
 => [true, true] 

そして、メソッド呼び出しはメソッドのインスタンスを返します。

> method(:require)
 => #<Method: Object(Kernel)#require> 

したがって、メソッドにはto_proc定義が必要であり、次のようになります。

class Method
  def to_proc
    proc { |obj| self.send(obj) }
  end
end

私の質問は、レールがメソッドまたは何でこのto_procをオーバーライドするかということです。

次のコマンドが動作している理由

> %w(action_controller/railtie action_mailer/railtie).map &method(:require)
 => [true, true] 
4

1 に答える 1

2

method#to_procメソッドを呼び出すとcall、指定された引数を渡すものを返します。例えば

method(:puts).call("hello world")

helloworldを出力します。そのメソッドは、それがどこから来たのか、この場合はスクリプトの最上位オブジェクトを「記憶」します。putsのようなメソッドrequireは(カーネルを介して)Objectで定義されるため、メソッドがどのオブジェクトにバインドされているかは実際には重要ではありません(もちろん、クラスが独自のrequireメソッドを定義していないと仮定します!)

したがって%w(action_controller/railtie action_mailer/railtie).map &method(:require)、requireを呼び出して、これらの文字列を一度に1つずつ渡し、戻り値を収集するのと同じです(これはtrue、requireの戻り値にあまり注意を払わないでください。

これはレールの問題ではありません。必要とされるファイルを使用して、バニラirbセッションでまったく同じことを行うことができます。私はこれをするつもりはありません-それは「理解できる」よりも「かわいい」を選ぶように私を襲います。

于 2012-06-01T18:00:21.133 に答える