Ruby-blocks
ルビー-ブロック
Rubyがメソッドを定義する方法を見てきました。ここでは、多数のステートメントを配置し、そのメソッドを呼び出すことができます。 同様に、Rubyにはブロックという概念があります。
- ブロックはコードのチャンクで構成されます。
- ブロックに名前を割り当てます。
- ブロック内のコードは常に中括弧(\ {})で囲まれています。
- ブロックは、ブロックの名前と同じ名前の関数から常に呼び出されます。 これは、_test_という名前のブロックがある場合、_test_関数を使用してこのブロックを呼び出すことを意味します。
- _yield_ステートメントを使用してブロックを呼び出します。
構文
block_name {
statement1
statement2
..........
}
ここでは、簡単な_yield_ステートメントを使用してブロックを呼び出す方法を学習します。 また、ブロックを呼び出すためのパラメーターで_yield_ステートメントを使用する方法も学習します。 両方のタイプの_yield_ステートメントでサンプルコードを確認します。
yieldステートメント
yieldステートメントの例を見てみましょう-
#!/usr/bin/ruby
def test
puts "You are in the method"
yield
puts "You are again back to the method"
yield
end
test {puts "You are in the block"}
これは、次の結果を生成します-
You are in the method
You are in the block
You are again back to the method
You are in the block
yieldステートメントでパラメーターを渡すこともできます。 ここに例があります-
#!/usr/bin/ruby
def test
yield 5
puts "You are in the method test"
yield 100
end
test {|i| puts "You are in the block #{i}"}
これは、次の結果を生成します-
You are in the block 5
You are in the method test
You are in the block 100
ここでは、_yield_ステートメントが記述され、その後にパラメーターが続きます。 複数のパラメーターを渡すこともできます。 ブロックでは、2つの垂直線(||)の間に変数を配置して、パラメーターを受け入れます。 したがって、上記のコードでは、yield 5ステートメントは値5をパラメーターとしてテストブロックに渡します。
さて、次の文を見てください-
test {|i| puts "You are in the block #{i}"}
ここでは、変数_i_で値5を受け取ります。 さて、次の_puts_ステートメントを観察してください-
puts "You are in the block #{i}"
この_puts_ステートメントの出力は次のとおりです-
You are in the block 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 block code
puts "BEGIN code block"
}
END {
# END block code
puts "END code block"
}
# MAIN block code
puts "MAIN code block"
プログラムには、複数のBEGINブロックとENDブロックを含めることができます。 BEGINブロックは、検出された順に実行されます。 ENDブロックは逆の順序で実行されます。 実行すると、上記のプログラムは次の結果を生成します-
BEGIN code block
MAIN code block
END code block