在Scala中如何将Nil识别为List类中的方法

时间:2019-03-14 03:59:30

标签: scala

我有下面的代码行,可在Scala中构造一个列表。

val oneTwoThree = 1 :: 2 :: 3 :: Nil

解释说:“最后需要Nil的原因是::是在类List上定义的。如果您只说1 :: 2 :: 3,它将将不会编译,因为3是Int,没有::方法。”

但是在代码行中,没有提到List类。有人可以帮我了解如何正确调用Nil类中的List方法吗?

2 个答案:

答案 0 :(得分:5)

Nil(请参阅here)是一个Scala对象(单个实例),该对象具有一个::方法,该方法返回一个List

由于方法名称上的规则以冒号结尾,因此3 :: Nil被转换为Nil.::(3)并返回List(3)List类还具有::方法,因此2 :: List(3)被转换为List(3).::(2)并返回List(2,3)。依此类推。

答案 1 :(得分:5)

例如,您可以将function ajax_13xx() return '<div align="right"><img src="abc.com/'.(wp_get_current_user()->s_managed == 'Yes' ? 'on' : 'off').'switch20.jpg"> </div>' ; } 视为用Java语言编写Nil。 它代表一个空列表。

列表层次结构的简化版本是:

[]

您没有在示例中看到列表,因为您使用的是其子级而不是直接使用列表。

请注意,您还可以使用sealed abstract class List[+A] final case class ::[+A](head: A, tail: List[A]) extends List[A] case object Nil extends List[Nothing] 创建一个列表,因为List随行对象还具有带有变量args的apply方法:

List(1, 2, 3)

您绝对需要Nil的原因是IS,因为它扩展了List。 ::方法(称为Cons)是在父级List特征上定义的,因此让我们更新它的版本:

object List {
  def apply[A](args: A*): List[A] = ...
}

现在,看起来Nil在行尾或至少在右边似乎很奇怪,因为通常使用sealed abstract class List[+A] { def ::[B >: A](x: B): List[B] = ... } 之类的方法(您可以顺便说一句),但使用{{1}右边的}是Scala约定,当您不写Nil.::而是使用空格时,它将绑定到右边的参数而不是左边。这样可以向后调用方法。

看看the Scala repo上的实际代码。