Хранение анонимной функции, переданной в качестве параметра на карте - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь реализовать простой сервер веб-приложений в качестве личного проекта для улучшения моего 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) на карту (или любую другую коллекцию Scala в этом отношении)?

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

Вот рабочий пример:

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 голос
/ 12 марта 2012

Может быть, этот?:

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

}
1 голос
/ 12 марта 2012

Вы можете попробовать этот код:

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")()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...