孤独プログラマー譚

孤独死が近い。

Rubyでクロージャ

JavaScriptでよく見るクロージャを、Rubyでもやってみる。

JavaScript 関数スコープ
・内側から外側の変数は利用できる。
・外側から内側の変数は利用できない。

Ruby ブロックスコープ
・内側から外側の変数は利用できる。
・外側から内側の変数は利用できない。

JavaScriptの場合、関数スコープを利用して、クロージャを実装する。
Rubyの場合、ブロックスコープを利用して、クロージャを実装する。


Procオブジェクトを返す関数を定義する場合。

def createCounter
  num = 0
  Proc.new do
    num += 1
    p num
  end
end

counter = createCounter

counter.call # 1
counter.call # 2
counter.call # 3
counter.call # 4
counter.call # 5


ProcオブジェクトからProcオブジェクトを返す場合。

createCounter = Proc.new do
  num = 0
  Proc.new do
    num += 1
    p num
  end
end

counter = createCounter.call

counter.call # 1
counter.call # 2
counter.call # 3
counter.call # 4
counter.call # 5


クロージャをあまり実務で使ったことない。もっと積極的に使おう。