【问题标题】:What is correct way to use operator orElse in Scala?在 Scala 中使用运算符 orElse 的正确方法是什么?
【发布时间】:2016-12-16 05:30:33
【问题描述】:

我想写两个服务,然后用orElse让两个服务结合在一起,意思是service_one或者service_two。他们都是 部分函数。

服务一是:

val usersService = HttpService {
case request @ GET -> Root / "users" / IntVar(userId) =>
  Ok("test")
}

服务二是:

val versionService = HttpService{
  case req @ GET -> Root / "version" => {
    val jsonmap = ("origin" -> req.remoteAddr.getOrElse("unknown ip"))
    Ok(compact(render(jsonmap)))
   }
}

然后我想将它们组合在一起。

val service = userService orElse versionService   //the error happens here.

错误是:

[error] F:\workspace\frankcheckAPI\src\main\scala\com\cardaccess\ServiceApp.scala:46: value orElse is not a member of org.http4s.HttpService
[error]   val service = usersService orElse versionService
[error]                              ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed

如果 case 匹配第一个服务的路径,则如何组合然后 make 然后工作,如果 case 匹配第二个服务的路径,则第一个服务工作。第二次服务工作。

ps:作为相关人士:

HttpService 对象定义如下:

  type HttpService = Service[Request, Response]
  object HttpService {

/** Alternative application which lifts a partial function to an `HttpService`,
  * answering with a [[Response]] with status [[Status.NotFound]] for any requests
  * where the function is undefined.
  */
def apply(pf: PartialFunction[Request, Task[Response]], default: HttpService = empty): HttpService =
  Service.lift(req => pf.applyOrElse(req, default))
...
}

【问题讨论】:

  • 什么是服务?您使用的是哪个框架?

标签: scala operators partialfunction


【解决方案1】:

orElsePartialFunction 一起使用,例如:

val t1: PartialFunction[Int, String] = {case 1 => "I am 1"}
val t2: PartialFunction[Int, String] = {case 2 => "I am 2"}
val t = t1 orElse t2
t(1)
> I am 1
t(2)
> I am 2

作为HttpService的apply方法签名接受PartialFunction,我想你可以这样做:

val usersService: PartialFunction[Request, Task[Response]] = {
  case request @ GET -> Root / "users" / IntVar(userId) =>
    Ok("test")
}

val versionService: PartialFunction[Request, Task[Response]] = {
  case req @ GET -> Root / "version" => {
    val jsonmap = ("origin" -> req.remoteAddr.getOrElse("unknown ip"))
    Ok(compact(render(jsonmap)))
   }
}
val service = HttpService {
  usersService orElse versionService
}

【讨论】:

  • 我添加了定义的 HttpService 对象。 @chengpohi
  • @user504909,很好,添加示例。
  • 不要认为这个“服务”有效,因为“用户服务”和“版本服务”都不是 PartialFunction 而是服务实例。
  • 还有Option, Try.. 非常方便。
猜你喜欢
  • 2013-07-28
  • 1970-01-01
  • 2021-10-28
  • 2021-02-13
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
相关资源
最近更新 更多