我有下面的代码行,可在Scala中构造一个列表。
val oneTwoThree = 1 :: 2 :: 3 :: Nil
解释说:“最后需要Nil
的原因是::
是在类List
上定义的。如果您只说1 :: 2 :: 3
,它将将不会编译,因为3是Int
,没有::
方法。”
但是在代码行中,没有提到List
类。有人可以帮我了解如何正确调用Nil
类中的List
方法吗?
答案 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上的实际代码。