Ruby の do/end ブロックに苦労しています。たとえば、次の例があります。
::ApplicationController.class_eval do
def close_sdb_connection
puts "Closing sdb connection."
end
end
このコードは何をしますか? ブロックが必要な理由 do/end ブロックのない同等のコードは何でしょうか?
Ruby の do/end ブロックに苦労しています。たとえば、次の例があります。
::ApplicationController.class_eval do
def close_sdb_connection
puts "Closing sdb connection."
end
end
このコードは何をしますか? ブロックが必要な理由 do/end ブロックのない同等のコードは何でしょうか?
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 を示すわけではないことに注意してください。
一般に、do
...end
または{
...}
ブロックは、残りのコードと同じ方法で評価されないコードを内部に配置するために使用されます。具体的には、ブロックは、特定のバインディング (つまり、ローカル変数とself
キーワードの特定の割り当て) の下で、特定のタイミングで特定の回数だけ評価されます。これらはすべて、ブロックがアタッチされているメソッドによって制御されます。
この特定のケースでは、ブロックは外部とは異なるバインディングで評価されます。特に、内部のコードは、レシーバーのクラス本体内にあるかのように評価され::ApplicationController
ます。