Ruby 块

あなたは Ruby でメソッドを定義する方法と呼び出す方法をすでに知っています。同様に、Ruby にはブロックの概念があります。

  • ブロックは大量のコードで構成されます。
  • ブロックには名前を付ける必要があります。
  • ブロック内のコードは常に中括弧 {} で囲まれます。
  • ブロックは常に同じ名前を持つ関数から呼び出されます。つまり、ブロック名がtestの場合、関数を使用する必要がありますtestこのブロックを呼び出すには
  • 使用できるのはyieldステートメントでブロックを呼び出します。

構文

block_name{ statement1 statement2 .......... }

ここでは、シンプルなyieldステートメントを使用してブロックを呼び出す方法を学びます。また、パラメータ付きのyieldステートメントを使用してブロックを呼び出す方法も学びます。例では、これら2種類の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 ステートメントは test ブロックに値 5 をパラメータとして渡します。

次に、以下のステートメントを見てください:

test {|i| puts "あなたはブロック #{i} 内にいます"}

ここでは、値 5 が変数 i に受け取られます。次に、以下の puts ステートメントを見てください:

puts "あなたはブロック #{i} 内にいます"

この puts ステートメントの出力は次のとおりです:

あなたはブロック内5 内

複数のパラメータを渡したい場合は、yieldステートメントは次のようになります:

yield a, b

この場合、ブロックは次のようになります:

test {|a, b| statement}

パラメータはカンマで区切られます。

ブロックとメソッド

ブロックとメソッドがどのように関連しているかを確認しました。通常、yield ステートメントを使用して、同じ名前のメソッドからブロックを呼び出します。したがって、コードは次のようになります:

例

#!/usr/bin/ruby def test yield end test{ puts "Hello world"}

この例は、ブロックを実装する最も簡単な方法です。あなたはyieldステートメントを使用して test ブロックを呼び出します。

ただし、メソッドの最後のパラメータの前に & が付いている場合は、そのメソッドにブロックを渡すことができ、そのブロックは最後のパラメータに代入できます。* と & がパラメータリストに同時に出現する場合は、& を後ろに置く必要があります。

例

#!/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 コードブロック"

1つのプログラムには複数の BEGIN ブロックと END ブロックを含めることができます。BEGIN ブロックは出現した順に実行されます。END ブロックは出現した逆順に実行されます。実行すると、上記のプログラムは次の結果を出力します:

BEGIN 代码块
MAIN 代码块
END 代码块
その他の拡張