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

时间:2012-01-10 18:33:20

标签: scala lift

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

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

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

3 个答案:

答案 0 :(得分:18)

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

scala> 1 :: 2 :: List(3, 4)
res0: List[Int] = List(1, 2, 3, 4)

这意味着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>)

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

答案 1 :(得分:5)

下划线表示不调用valMinLen,而是用作函数“指针”。

::运算符连接列表。

换句话说,它似乎代码构建了一个列表validations,它由一个函数“指针”组成valMinLen并给出了参数,列表的其余部分是{{ 1}},这是超类的验证。

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

答案 2 :(得分:0)

使用适当的缩进并引入val:

,代码可能更具可读性
object permanent_link extends MappedString(this, 150) {

  override def validations = minimumValidation :: super.validations

  val minimumValidation = valMinLen(3,"Link URL must be at least 5 characters") _
}

如前所述,::运算符只是在列表中添加一个新元素,_与它无关,用于获取函数对象,如

(1 :: 2 :: Nil) map (println _)

创建列表[1,2]并将函数println应用于每个元素(这里实际上可以省略下划线)。对象println _println方法构造一个函数对象,_表示函数的单个参数。