final def apply(block: => Result): Action[AnyContent] =
apply(BodyParsers.utils.ignore(AnyContentAsEmpty: AnyContent))(_ => block)
有人知道这个AnyContentAsEmpty: AnyContent
是什么意思吗?特别是: AnyContent
?
答案 0 :(得分:3)
有人知道这个
AnyContentAsEmpty: AnyContent
是什么意思吗?
特别是
: 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 _ => ()
}