为什么命令中的`map`有时会将结果包装成元组?

时间:2017-01-15 06:10:29

标签: scala akka-http

以下example from the the Akka HTTP docucumentation表明您可以使用map上的Directives方法来转换其价值,就像您期望的那样。

val textParam: Directive1[String] =
  parameter("text".as[String])

val lengthDirective: Directive1[Int] =
  textParam.map(text => text.length)

但是,当我尝试使用我自己的示例时,我得到了Tuple1期望类型的指令,而不是预期类型本身的指令。例如:

val stringOpsDirective: Directive[Tuple1[StringOps]] =
  textParam.map(text => augmentString(text))

我看到map采用隐式Tupler参数,但查看实现可以找到特征,我不知道所有内容都没有包含在Tuple中。

1 个答案:

答案 0 :(得分:1)

在使用map时,您声明了一个与示例中使用的声明略有不同但等效的返回类型。示例返回类型'指令 1 '您返回类型'指令'。

如果您使用Directive1,您的示例采用与文档中相同的格式:

val stringOpsDirective: Directive1[StringOps] =
  textParam.map(text => augmentString(text))

这是有效的,因为Directive1[_]Directive[Tuple1[_]]的别名,定义如下:

type Directive1[T] = Directive[Tuple1[T]]

换句话说,你是对的,每个Directive都被参数化地输入某种Tuple。但是,在Directive1的情况下,您可以使用Tuple1类型隐藏该事实。