ルビーブロック
Ruby がメソッドを定義し、メソッドを呼び出す方法はすでにご存知でしょう。同様に、Ruby にはブロックの概念があります。
ブロックは大量のコードで構成されています。
ブロックに名前を付ける必要があります。
ブロック内のコードは常に中括弧 {} で囲まれます。
ブロックは常にそれと同じ名前の関数から呼び出されます。これは、ブロック名が test の場合、関数 test を使用してこのブロックを呼び出すことを意味します。
yieldステートメントを使用してブロックを呼び出すことができます。
構文
block_name{ statement1 statement2 .......... }
ここでは、簡単なyieldステートメントを使用してブロックを呼び出す方法を学びます。パラメーターを指定した yield ステートメントを使用してブロックを呼び出す方法も学習します。この例では、両方のタイプの yield ステートメントが表示されます。
yield ステートメント
yield ステートメントの例を見てみましょう:
#!/usr/bin/ruby # -*- coding: UTF-8 -*- def test puts "在 test 方法内" yield puts "你又回到了 test 方法内" yield end test {puts "你在块内"}
上記の例の結果は次のようになります:
在 test 方法内 你在块内 你又回到了 test 方法内 你在块内
パラメーターを指定して yield ステートメントを渡すこともできます。以下は例です:
#!/usr/bin/ruby # -*- coding: UTF-8 -*- def test yield 5 puts "在 test 方法内" yield 100 end test {|i| puts "你在块 #{i} 内"}
上記の例の結果は次のようになります:
你在块 5 内 在 test 方法内 你在块 100 内
ここで、yield ステートメントの後にパラメータが続きます。複数のパラメータを渡すこともできます。ブロックでは、2 つの垂直バーの間に変数を配置して引数を受け入れます。したがって、上記のコードでは、yield 5 ステートメントは値 5 をパラメーターとしてテスト ブロックに渡します。
ここで、次のステートメントを見てください:
test {|i| puts "你在块 #{i} 内"}
ここでは、値 5 が変数 i に受け取られます。ここで、次の put ステートメントを観察してください:
puts "你在块 #{i} 内"
この Put ステートメントの出力は次のとおりです:
你在块 5 内
複数のパラメータを渡したい場合、yield ステートメントは次のようになります:
yield a, b
この時点で、ブロックは次のようになります。次のように:
test {|a, b| statement}
パラメータはカンマで区切られます。
ブロックとメソッド
ブロックとメソッドが互いにどのように関係しているかを見てきました。通常は、yield ステートメントを使用して、同じ名前のメソッドからブロックを呼び出します。したがって、コードは次のようになります:
#!/usr/bin/ruby def test yield end test{ puts "Hello world"}
この例は、ブロックを実装する最も簡単な方法です。 yield ステートメントを使用してテスト ブロックを呼び出します。
ただし、メソッドの最後のパラメーターの前に & が付いている場合は、メソッドにブロックを渡すことができ、そのブロックを最後のパラメーターに割り当てることができます。 * と & がパラメーター リストに同時に表示される場合は、& を後に置く必要があります。
#!/usr/bin/ruby def test(&block) block.call end test { puts "Hello World!"}
上記の例の結果は次のとおりです:
Hello World!
BEGIN ブロックと END ブロック
各 Ruby ソース ファイルは、ファイルのロード時に実行されるコード ブロック (BEGIN ブロック) を宣言でき、ファイルのロード後に実行されます。プログラムはコードの実行ブロック (END ブロック) を完了します。
#!/usr/bin/ruby BEGIN { # BEGIN 代码块 puts "BEGIN 代码块" } END { # END 代码块 puts "END 代码块" } # MAIN 代码块 puts "MAIN 代码块"
プログラムには複数の BEGIN ブロックと END ブロックを含めることができます。 BEGIN ブロックは、出現した順序で実行されます。 END ブロックは、出現した順序とは逆の順序で実行されます。上記のプログラムを実行すると、次の結果が生成されます:
BEGIN 代码块 MAIN 代码块 END 代码块