Scala中的_ ::是什么意思?

Jar*_*rek 7 scala lift

我正在阅读一本关于电梯的书,我遇到了一些我不太了解的东西: _ ::

object permanent_link extends MappedString(this, 150){
    override def validations =
    valMinLen(3, "Link URL must be at least 5 characters") _ ::
    super.validations
}
Run Code Online (Sandbox Code Playgroud)

我找不到任何提示,所以如果有人能帮助我,我将不胜感激.

Tom*_*icz 18

我不知道Lift,但这是一个普遍的问题.首先,这::是一个Scala cons运算符:

scala> 1 :: 2 :: List(3, 4)
res0: List[Int] = List(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

这意味着它super.validations是某种序列,并且valMinLen(3, "Link URL must be at least 5 characters") _是该列表中的单个值.

从上下文看,很明显,在重写validations方法中,它们调用super版本在开头添加一些额外的验证.

这个额外的验证是通过调用来创建的valMinLen().但是,这个额外的调用不会返回与validations列表类型匹配的元素- 而是一个函数.我们明确地说(通过添加_后缀`)我们想要预先添加一个函数本身,而不是前面的函数值,而不是该函数的返回值.

代码片段胜过千言万语:

scala> def f = 3
f: Int

scala> def g = 4
g: Int

scala> val listOfInts = List(f, g)
listOfInts: List[Int] = List(3, 4)

scala> val listOfFunctions = List(f _, g _)
listOfFunctions: List[() => Int] = List(<function0>, <function0>)
Run Code Online (Sandbox Code Playgroud)

比较的类型listOfIntslistOfFunctions.我相信f _语法在Scala世界中称为部分应用函数.


Joa*_*son 5

下划线表示不调用valMinLen,而是用作函数"指针".

::运算符连接列表.

换句话说,它似乎是代码构建一个列表validations,该列表由一个函数"指针" valMinLen和给定的参数组成,列表的其余部分是值super.validations,即超类的验证.

我相信有人会在这里纠正我的术语:)