クロージャをオブジェクトっぽく使う
連想配列のオブジェクトをクロージャにすると、オブジェクトっぽく振る舞うようになった。
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は、構造体を返すクラス。