Λ Takuya71 の日記 Λ

ここに記載の内容は個人的な見解で 勤務先、所属先には関連はございません。最近は scala に はまってます。認定スクラムマスター

引数で返す関数が変わるクロージャ(のつもり)

引数で返す関数が変わるクロージャ by Scala

実用性はあると思いませんが、
class の代わりのようなことが Scala のクロージャ使って出来ないかをすこし試してみました。

scalajavascript

    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}
           }

うーん、クロージャってクラスの方が使い勝手がいい気がして クロージャ使いどころが難しい。