引数で返す関数が変わるクロージャ(のつもり)
引数で返す関数が変わるクロージャ by Scala
実用性はあると思いませんが、
class の代わりのようなことが Scala のクロージャ使って出来ないかをすこし試してみました。
scala で javascript の
return{ up : function(num){ i += num; }, get : function(){ return i; } }
に相当する書き方があるのか わからなかったので
きれいではない気がするのですが Map 使ってやってみました。
def func() = { var i = 0 Map( "up"->{()=>{i += 1;i}}, "get"->{()=>{i}}, "down"->{()=>{i -= 1;i}} ) } val fn1 = func()
実行結果
scala> fn1("get")() res87: Int = 0 <== 最初は0 scala> fn1("up")() res88: Int = () <== 1回目UP scala> fn1("up")() res89: Int = () <== 2回目UP scala> fn1("get")() res90: Int = 2 <== 0から2に変わる scala> fn1("down")() <== Down実行 res91: Int = () scala> fn1("get")() res92: Int = 1 <== 2 から 1に変わる
意図したようには動作しているようです。
ただ、これなら 普通 class 使いますよね。
scala> class counter() { private var i:Int = 0 def get():Int = { i } def up():Int = { i += 1;i } def down():Int = { i -= 1;i} }
うーん、クロージャってクラスの方が使い勝手がいい気がして クロージャ使いどころが難しい。