在Scala中重构为高阶函数?

时间:2013-02-13 03:35:59

标签: scala

学习Scala并尝试重构以下两个函数以删除重复的逻辑。我应该创建一个更高阶的函数或其他东西,以避免重复的代码?使用这样的重复代码有一些更类似的方法,只有不同的调用不同的Domain方法。

对重构感到困惑。使用Scala版本2.10

def authenticate = Action(parse.json) { request =>
  val json = request.body
  val input = Json.fromJson[User](json)
  input.asOpt match {
    case Some(m: User) => Ok(Domain.authenticate(m)).as("application/json")
    case None => Ok("bad input")
  }
}

def addUser = Action(parse.json) { request =>
  val json = request.body
  val input = Json.fromJson[User](json)
  input.asOpt match {
    case Some(m: User) => Ok(Domain.addUser(m)).as("application/json")
    case None => Ok("bad input")
  }
}

2 个答案:

答案 0 :(得分:2)

我猜你可以做类似的事情(未经测试):

private def common[A](f:User=>A)(request:RequestHeader) = {
  val json = request.body
  val input = Json.fromJson[User](json)

  input.asOpt match {
    case Some(m: User) => Ok(f(m)).as("application/json")
    case None => Ok("bad input")
  }
}

def addUser = Action(parse.json) { common(Domain.adduser)(_) }

def authenticate = Action(parse.json) { common(Domain.authenticate)(_) } 

答案 1 :(得分:0)

我也是Scala的新手,但我认为我们可以做这样的事情。如果我错了,请纠正我。

你可以做这样的事情

def foo(f:Int=>Int,x:Int):Int = {f(x)}
   foo(x=>x+x,3)

同样地,您可以将要调用的函数传递给公共函数。