我正在尝试将一个简单的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...
}
}
服务器启动时会调用 routes
,get
和post
是我定义的函数,如下所示:
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集合)物质)?
答案 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
。它应简化设计(如果包含DEL
和PUT
,最多会以四张地图结束。
答案 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"
}
}