Kernel#at_exitメソッドとEND(すべて大文字)キーワードの間にどのような違いがありますか?後者は単に物事を行うためのよりPerlishの方法であり、前者はよりRuby風ですか?
やってみdefined?(END {puts "Bye"})
ましたが、構文エラーが発生しました。
Kernel#at_exitメソッドとEND(すべて大文字)キーワードの間にどのような違いがありますか?後者は単に物事を行うためのよりPerlishの方法であり、前者はよりRuby風ですか?
やってみdefined?(END {puts "Bye"})
ましたが、構文エラーが発生しました。
「Rubyプログラミング言語」は、それらの動作のわずかな違いを定義しています。at_exit
ループ内で複数回呼び出すことができ、コードが終了すると各反復呼び出しが実行されます。END
ループ内で1回だけ呼び出されます。
... ENDステートメントがループ内にあり、複数回実行された場合でも、それに関連付けられたコードは1回だけ登録されます。
a = 4;
if (true)
END { # This END is executed
puts "if"; # This code is registered
puts a # The variable is visible; prints "4"
}
else
END { puts "else" } # This is not executed
end
10.times {END { puts "loop" }} # Only executed once
カーネル法at_exitは、ENDステートメントの代替手段を提供します。インタプリタが終了する直前に実行されるコードのブロックを登録します。ENDブロックと同様に、最初のat_exit呼び出しに関連付けられたコードは最後に実行されます。at_exitメソッドがループ内で複数回呼び出された場合、それに関連付けられたブロックは、インタープリターが終了するときに複数回実行されます。
だから、実行しています:
2.times {
END { puts 'END'}
at_exit { puts 'at_exit' }
}
結果:
at_exit at_exit 終わり
メソッド内で使用END
すると警告が生成されますが、at_exit
機能しません(どちらも機能しますが)。
def with_end
END {puts 'with END'}
end
def with_at_exit
at_exit {puts 'with at_exit'}
end
with_end
with_at_exit
出力:
$ ruby foo.rb
foo.rb:2: warning: END in method; use at_exit
with at_exit
with END
あまり実用的ではないレベルでEND
は、は言語キーワードでありat_exit
、言語のメソッドです。