为什么在scala中创建List时我们需要Nil?

Sur*_*aja 10 scala list

我在List上有一个基本问题

当我尝试使用cons运算符创建List时,我收到以下错误

scala> val someList = 1::2
<console>:10: error: value :: is not a member of Int
   val someList = 1::2
                   ^
Run Code Online (Sandbox Code Playgroud)

但是如果你看下面的话,一旦我添加了Nil,它就会起作用..

    scala> val someList = 1::2::Nil
    someList: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么在创建列表时至少需要Nil一次

Nil是数据类型吗?还是空元素?

the*_*eye 12

正是因为这个原因.

value ::不是Int的成员

在Scala中,运算符实际上是对象的函数.在这种情况下,::Nil对象上的函数,它实际上是一个空列表对象.

scala> Nil
res0: scala.collection.immutable.Nil.type = List()
Run Code Online (Sandbox Code Playgroud)

当你这样做时1::2,Scala会查找名为::on 的函数2,但它找不到它.这就是它失败的原因.


注意:在Scala中,如果运算符的最后一个字符不是冒号,则在第一个操作数上调用运算符.例如,1 + 2基本上是1.+(2).但是,如果最后一个字符是冒号,则在右侧操作数上调用该运算符.所以在这种情况下,1 :: Nil实际上是Nil.::(1).因为,::返回另一个列表对象,你可以链接它,就像这样1 :: 2 :: Nil,Nil.::(2).::(1).


sep*_*p2k 7

名称以其结尾的中缀运算符:被解释为操作数上的方法调用.所以1 :: 2IS 2.::(1),即它调用的方法::2.同样1 :: 2 :: NilNil.::(2).::(1).

第一个不起作用的原因2是a IntInts没有::方法.第二个工作的原因Nil是列表和列表确实有一个::方法.而且由于结果List.::也是一个列表,你仍然可以调用::第一个结果::.