Ruby-ブロック
多数のステートメントを配置できるメソッドをRubyがどのように定義し、そのメソッドを呼び出すかを見てきました。同様に、Rubyにはブロックの概念があります。
ブロックはコードのチャンクで構成されます。
ブロックに名前を割り当てます。
ブロック内のコードは常に中括弧({})で囲まれています。
ブロックは常に、ブロックと同じ名前の関数から呼び出されます。これは、testという名前のブロックがある場合、関数testを使用してこのブロックを呼び出すことを意味します。
イールドステートメントを使用してブロックを呼び出します。
構文
block_name {
statement1
statement2
..........
}
ここでは、簡単な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本の垂直線(||)の間に変数を配置して、パラメーターを受け入れます。したがって、上記のコードでは、yield5ステートメントは値5をパラメーターとしてテストブロックに渡します。
さて、次のステートメントを見てください-
test {|i| puts "You are in the block #{i}"}
ここで、値5は変数iで受け取られます。ここで、次の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"}
この例は、ブロックを実装する最も簡単な方法です。イールドステートメントを使用してテストブロックを呼び出します。
ただし、メソッドの最後の引数の前に&が付いている場合は、このメソッドにブロックを渡すことができ、このブロックは最後のパラメーターに割り当てられます。*と&の両方が引数リストに存在する場合、&は後で来る必要があります。
#!/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