クロージャをオブジェクトっぽく使う

連想配列のオブジェクトをクロージャにすると、オブジェクトっぽく振る舞うようになった。

Javascript

function closure_factory(name, age){
  var animal = {};
  animal.name = name;
  animal.age = age;
  animal.say = function(){
    return animal.name + "_" + animal.age;
  }
  return function(){ return animal };
}

cat = closure_factory("tama", 14);

alert(cat().name);
alert(cat().say());

Rubyで書き直すとこう書く。

Ruby

def closure_factory name, age 
  animal= Struct.new("Animal", :name, :age, :say)
  cat = animal.new(name, age)
  cat.say = proc{ "#{cat.age}_#{cat.name}" }.call
  return proc{cat}.call
end

cat = closure_factory("tama", 14) 

p cat.name
p cat.say

Rubyで、変数にコードの集まり(関数)を入れるには、Procオブジェクトを使う。
callメソッドでProcインスタンスの中を実行できる。
Structは、構造体を返すクラス。