1

Ruby の do/end ブロックに苦労しています。たとえば、次の例があります。

::ApplicationController.class_eval do
  def close_sdb_connection
    puts "Closing sdb connection."       
  end
end

このコードは何をしますか? ブロックが必要な理由 do/end ブロックのない同等のコードは何でしょうか?

4

2 に答える 2

2

doおよびendは予約語です。それらには、一般的なより高い目的はありません(少なくとも、マッツがラリー・ウォールのように気が狂って、そう言うまでは)。サンプル コードでは、外部do ... endはコード ブロックを意味します – と同じ{ ... }です。internalは、メソッド定義endの右側の区切り文字として機能します。def ... end

のコンテキストではclass_eval、OP のコード サンプルは次とまったく同じことを行います。

class ::ApplicationController
  def close_sdb_connection
    puts "Closing sdb connection."
  end
end

ただし、 などのブロック ステートメントは、ブロックがローカル変数に対するクロージャであるためFoo.class_eval do ... end、 などの非ブロック ステートメントとは大きく異なります。class Foo; ... end

それぞれdo ... endが block を示すわけではないことに注意してください。

于 2013-11-11T14:18:39.877 に答える
2

一般に、do...endまたは{...}ブロックは、残りのコードと同じ方法で評価されないコードを内部に配置するために使用されます。具体的には、ブロックは、特定のバインディング (つまり、ローカル変数とselfキーワードの特定の割り当て) の下で、特定のタイミングで特定の回数だけ評価されます。これらはすべて、ブロックがアタッチされているメソッドによって制御されます。

この特定のケースでは、ブロックは外部とは異なるバインディングで評価されます。特に、内部のコードは、レシーバーのクラス本体内にあるかのように評価され::ApplicationControllerます。

于 2013-11-11T14:29:10.150 に答える