内容
Rubyのブロックは、コードの一部をカプセル化し、再利用可能にする強力な機能です。この記事では、ブロックの基本的な使い方から、スコープの生成、クロージャの使用に至るまでを掘り下げていきます。
ブロックとは何か?
基本的なブロックの使用
def func x
x + yield
end
p func(1){ 2 } # 出力: 3
この例では、{}
で囲まれた部分がブロックであり、yield
を使用してその中身を実行しています。
ブロックによるスコープの生成
def func y
y + yield
end
func(1) do
x = 2
end
# 「p x」を実行するとNameErrorが発生
ブロック内で定義された変数は、そのブロックの外部からはアクセスできないことを示しています。{}
と do...end
はどちらもブロックを生成しますが、一般的に一行で書ける場合は {}
を、複数行にわたる場合は do...end
を使用します。
ブロックと変数のスコープ
ブロック外の変数をブロック内で参照
def func y
y + yield
end
x = 2
p func(1){ x+=2 } # 出力: 5
p x # 出力: 4
この部分では、ブロック内でブロック外の変数 x
を参照し、変更する方法を示しています。これはRubyにおける「クロージャ」の一例で、メソッド内部から外部を参照する方法の一つです。
ブロックと引数の操作
def func a, b
a + yield(b,3)
end
p func(1,2) {|x, y| x + y} # 出力: 6
yield
の引数を使って、ブロックの引数である x
と y
の挙動を制御しています。この場合、1 + (2 + 3)
の計算が行われます。
ブロックの存在を判定する
def func
return 1 if block_given?
2
end
p func(){} # 出力: 1
p func # 出力: 2
block_given?
メソッドを使用することで、ブロックが与えられているかどうかを判定できます。