23

ほとんどの場合、検索時に機密性が高くないため、この単語を見つけるのは非常に困難です。ドキュメント以外で見つけた最良のものは、IRB でのテストです。

 BEGIN{puts x = 10}
 10
4

6 に答える 6

23

すべてのキーワード BEGINおよびは、のパブリック インスタンス メソッドENDとして文書化されているため (これらが から返されることはありませんが)ObjectObject.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 ブロックは逆の順序で実行されます。

于 2013-03-10T19:03:18.507 に答える
19

言及されていないことの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は、に存在していたのでそれを持っています。デフォルトでは、ファイルは一連のパターンとアクションで構成されているため、これは非常に理にかなっています。awkawkawk

/foo/ { print $1 }
/bar/ { print $2 }

すべてのパターンがすべての行に対してチェックされます。パターンが一致する場合、アクションが実行されます。それ以外の場合はawk、次のパターンに進みます。したがって、上記のミニスクリプトでは、行が「foo」と一致する場合、最初のフィールドが出力されます。行が「bar」と一致する場合、2番目のフィールドが出力されます。

しかし、これで、BEGIN(および)ブロックが埋めるギャップを確認できます。入力がテストされる前、またはすべての入力が確認された後(レポートの上部にヘッダーを印刷したり、印刷したりするなど)、無条件END何かを実行したい場合はどうでしょうか。レポートの最後にある合計の行)?パターン+アクションの通常の線はそこであなたを助けることができません。awk

それが理由BEGINであり、END存在します。しかし、それらが現代の慣用的なRubyスクリプトにどれほど役立つかはわかりません。しかし、dbenhurがコメントで指摘しているように、awkワンライナーのように、Rubyを非常にうまく使用できます。(標準のRubyテストライブラリであるMiniTestがat_exitテスト用の関数を使用していたことも覚えていますが、それがもう機能するかどうかはわかりません。)

awkRubyとRubyワンライナーに関する2つの優れたリンク:

于 2013-03-10T20:03:56.720 に答える
7

Ruby プログラミング言語から:


BEGINENDブロック

すべての Ruby ソース ファイルは、ファイルの読み込み中 (BEGINブロック) およびプログラムの実行終了後(ブロック) に実行されるコード ブロックを宣言できますEND

BEGIN {
  # begin code
} 
END {
  # end code
}

プログラムには、複数のBEGINandENDブロックが含まれる場合があります。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
于 2013-03-10T19:03:44.110 に答える
5

BEGIN ブロックはまさに​​あなたが想定しているものであり、つまり、指定されたブロックがプログラム内の残りのコードよりも先に実行されるということです。

これは一例です。

puts "Goodbye cruel world!"

BEGIN {
puts "Hello World!"
}

それが役立つことを願っています。

値のコレクションがファイルの最後に邪魔にならないように配置されていますが、最初に評価されるミニテストには、これの実例があります

于 2013-03-10T19:03:43.263 に答える
2

-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 が結果を出力する方法に注意してください。

于 2014-07-16T01:40:23.217 に答える