ほとんどの場合、検索時に機密性が高くないため、この単語を見つけるのは非常に困難です。ドキュメント以外で見つけた最良のものは、IRB でのテストです。
BEGIN{puts x = 10}
10
ほとんどの場合、検索時に機密性が高くないため、この単語を見つけるのは非常に困難です。ドキュメント以外で見つけた最良のものは、IRB でのテストです。
BEGIN{puts x = 10}
10
すべてのキーワード BEGIN
およびは、のパブリック インスタンス メソッドEND
として文書化されているため (これらが から返されることはありませんが)Object
Object.public_instance_methods
BEGINコード ブロックを介して、プログラムの順次実行が開始される前に無条件に実行されるコードを指定します。メソッドへの前方参照をシミュレートするために使用されることがあります。
puts times_3(gets.to_i) BEGIN { def times_3(n) n * 3 end }
ENDコード ブロックを介して、プログラムの終了直前に実行するコードを指定します。
END { puts "Bye!" }
Programming Ruby The Pragmatic Programmer's Guideからのより詳細な説明
BEGIN ブロックと END ブロック
すべての Ruby ソース ファイルは、ファイルの読み込み中 (BEGIN ブロック) およびプログラムの実行終了後 (END ブロック) に実行されるコード ブロックを宣言できます。
BEGIN { begin code } END { end code }
プログラムには、複数の BEGIN ブロックと END ブロックを含めることができます。BEGIN ブロックは、検出された順序で実行されます。END ブロックは逆の順序で実行されます。
言及されていないことの1つは、以前のバージョンのRubyではBEGIN
無条件であったことです。
if false
BEGIN { puts "Up is down, hot is cold, good is evil!" }
end
Ruby 1.8.7でそれを試してみると、そのブランチにある場合でも、文は印刷さif
れます。
Ruby 2.0.0ではBEGIN
、トップレベルの外部で使用すると構文エラーが発生します(これを処理するためのはるかにスマートな方法)。
unconditional.rb:2: BEGIN is permitted only at toplevel
BEGIN { puts "Up is down, hot is cold, good is evil!" }
^
編集:ある意味で、あなたがコメントで提起した質問に誰も答えていません:なぜRubyはBEGIN
まったく持っているのですか?私が試してみます。PerlBEGIN
から(多くのもののように)Rubyに来ます。Perlは、に存在していたのでそれを持っています。デフォルトでは、ファイルは一連のパターンとアクションで構成されているため、これは非常に理にかなっています。awk
awk
awk
/foo/ { print $1 }
/bar/ { print $2 }
すべてのパターンがすべての行に対してチェックされます。パターンが一致する場合、アクションが実行されます。それ以外の場合はawk
、次のパターンに進みます。したがって、上記のミニスクリプトでは、行が「foo」と一致する場合、最初のフィールドが出力されます。行が「bar」と一致する場合、2番目のフィールドが出力されます。
しかし、これで、BEGIN
(および)ブロックが埋めるギャップを確認できます。入力がテストされる前、またはすべての入力が確認された後(レポートの上部にヘッダーを印刷したり、印刷したりするなど)、無条件にEND
何かを実行したい場合はどうでしょうか。レポートの最後にある合計の行)?パターン+アクションの通常の線はそこであなたを助けることができません。awk
それが理由BEGIN
であり、END
存在します。しかし、それらが現代の慣用的なRubyスクリプトにどれほど役立つかはわかりません。しかし、dbenhurがコメントで指摘しているように、awk
ワンライナーのように、Rubyを非常にうまく使用できます。(標準のRubyテストライブラリであるMiniTestがat_exit
テスト用の関数を使用していたことも覚えていますが、それがもう機能するかどうかはわかりません。)
awk
RubyとRubyワンライナーに関する2つの優れたリンク:
BEGIN
とEND
ブロックすべての Ruby ソース ファイルは、ファイルの読み込み中 (BEGIN
ブロック) およびプログラムの実行終了後(ブロック) に実行されるコード ブロックを宣言できますEND
。
BEGIN {
# begin code
}
END {
# end code
}
プログラムには、複数のBEGIN
andEND
ブロックが含まれる場合があります。BEGIN
ブロックは、遭遇した順に実行されます。END
ブロックは逆の順序で実行されます。
そう:
$ cat beginend.rb
END { puts :end }
BEGIN { puts :begin }
END { puts :end2 }
BEGIN { puts :begin2 }
puts :run
$ ruby beginend.rb
begin
begin2
run
end2
end
BEGIN ブロックはまさにあなたが想定しているものであり、つまり、指定されたブロックがプログラム内の残りのコードよりも先に実行されるということです。
これは一例です。
puts "Goodbye cruel world!"
BEGIN {
puts "Hello World!"
}
それが役立つことを願っています。
値のコレクションがファイルの最後に邪魔にならないように配置されていますが、最初に評価されるミニテストには、これの実例があります。
-e オプションを使用してストリームを処理する場合、BEGIN/END は非常に便利です。たとえば、数値のファイルを合計するには、次のようにします。
cat <<EOF > numbers
1
5
10
20
EOF
cat numbers | ruby -ane 'BEGIN { $t=0}; END {puts $t}; $t += $_.to_i'
BEGIN がグローバルをゼロにし、END が結果を出力する方法に注意してください。