Scala方法用冒号调用参数

时间:2017-08-20 18:24:05

标签: scala

final def apply(block: => Result): Action[AnyContent] =
    apply(BodyParsers.utils.ignore(AnyContentAsEmpty: AnyContent))(_ => block)

有人知道这个AnyContentAsEmpty: AnyContent是什么意思吗?特别是: AnyContent

2 个答案:

答案 0 :(得分:3)

  

有人知道这个AnyContentAsEmpty: AnyContent是什么意思吗?

这是Typed Expression

  

特别是: AnyContent

这是Type Ascription,用于将类型归类为表达式,从而使表达式成为类型化表达式。

通常情况下,Scala会在没有您帮助的情况下计算表达式的类型,但如果您不喜欢Scala计算的类型,则可以将特定类型归因于表达式。

例如,对于表达式

42

Scala计算类型Int。你也可以写

42: Int
而是,你会得到相同的结果。如果希望42输入Int,您可以将其归类为不同的类型,例如:

42: Long

现在,表达式的类型为Long,而不是Int。例如,如果您要将其分配给val,并且不为val提供类型,则Scala会推断类型Long

val a       = 1       // 1 has type Int, therefore Scala infers type Int for a
val b: Long = 1       // b is typed as Long, therefore Scala converts 1 to a Long
val c       = 1: Long // 1 is typed as Long, therefore Scala infers type Long for c

您可以使用它来指导Scala推断更合理的类型,或选择特定的过载。

答案 1 :(得分:0)

表单expr: Type的表达式仅表示expr的值,但类型为Type。这在指导类型推断时很有用。也就是表达式

AnyContentAsEmpty

有类型

AnyContentAsEmpty.type

,而

AnyContentAsEmpty: AnyContent

有类型

AnyContent

我不确定为什么会在这里使用它,但也许你可以移除: AnyContent并看看会发生什么。

此语法称为类型ascription ,还有两个用途:隐式转换和varargs。另外,请注意它与变量声明/ case声明(val x: Any = ??? / case x: String => ???)的相似之处。

class Base
class Extn
implicit def Base2Extn(b: Base) = new Extn
val x = new Base // x has type Base
val y = new Base: Extn // y is Base2Extn(new Base), with type Extn

def f(args: Any*): Unit = args match {
  // `tail: _*` is like saying "use tail as a bunch of arguments instead of just one"
  // Bit of a stretch but I think that's why the syntax was chosen
  case head +: tail => { println(head); f(tail: _*) }
  case _ => ()
}