存储作为Map中的参数传递的匿名函数

时间:2012-03-12 09:54:15

标签: scala

我正在尝试将一个简单的Web应用程序服务器作为个人项目来改进我的Scala,但我遇到了一个问题。

我希望能够使用以下代码设置路线:

def routes()
{
    get("/wobble")
    {
        ...many lines of code here...
    }

    get("/wibble")
    {
        ...many lines of code here...
    }

    post("/wibble")
    {
        ...many lines of code here...
    }

    post("/wobble")
    {
        ...many lines of code here...
    }
}
服务器启动时会调用

routesgetpost是我定义的函数,如下所示:

get(url:String)(func:()=>String)=addroute("GET",url,func)
post(url:String(func:()=>String)=addroute("POST",url,func)

addroute(method:String,url:String,f:()=>String)
{
    routesmap+=(method->Map[String,()=>String](url,func))
}

不幸的是,我只有这个问题。任何人都可以告诉我在Scala中使用正确的方式将一个匿名函数(作为上面定义的routes函数中的参数传入)添加到Map(或任何其他Scala集合)物质)?

3 个答案:

答案 0 :(得分:2)

这是一个有效的例子:

scala> var funcs = Map[String,(Int)=>Int]()
funcs: scala.collection.immutable.Map[String,Int => Int] = Map()

scala> funcs += ("time10", i => i * 10 )

scala> funcs += ("add2", i => i + 2 )

scala> funcs("add2")(3)
res3: Int = 5

scala> funcs("time10")(10)
res4: Int = 100

您还可以添加声明的函数:

val minus5 = (i:Int) => i - 5
funcs += ( "minus5", minus5)

或方法:

def square(i: Int) = i*i
funcs += ("square", square)

在您的情况下,您可以有两张地图,一张用于GET,另一张用于POST。它应简化设计(如果包含DELPUT,最多会以四张地图结束。

答案 1 :(得分:1)

你可以试试这段代码:

def addRoute(method:String,url:String,f:()=>String) = {     

routesmap+=(method-> (routesmap.getOrElse(method,Map[String,()=>String]()) + (url->f)))

}

def get(url:String,func:()=>String)= addRoute("GET",url,func) 

def post(url:String,func:()=>String)= addRoute("POST",url,func)


def routes() 
{
get("/wobble",()=>{"toto"})
get("/wibble",()=>{println("test")
                   "titi"})
}

并执行这些命令

scala> routes
scala> routesmap.get("GET").get("/wibble")()

答案 2 :(得分:1)

可能是,这一个? :

type Fonc = ( (=> String) => Unit)

var routesmap = Map[String,Map[String,()=>String]]()

def addRoute(method:String,url:String,f:()=>String) = {     

routesmap+=(method-> (routesmap.getOrElse(method,Map[String,()=>String]()) + (url->f)))

}

def get(url:String):Fonc = (x => addRoute("GET",url,() => x))
def post(url:String):Fonc = (x => addRoute("POST",url,() => x))

def routes() 
{
post("/wobble")
{
"toto"
}

get("/wibble")
{
"titi"
}

}