按比例 repl
scala> List(1) :: 2
<console>:8: error: value :: is not a member of Int
List(1) :: 2
但
scala> 2 :: List(1);
res4: List[Int] = List(2, 1)
这是反直观的,因为如果从左到右读取中缀运算符,则上述行可以转换为
List(1) :: 2
List(1).::(2)
和
2 :: List(1)
2.::(List(1))
我会想象一个Int
没有::
而一个List
却没有的方法。我是在假设什么地方吗?
这是反直观的,因为如果从左到右读取中缀运算符
如果您考虑一下,从逻辑上讲,这是很有意义的。该::
(缺点)运营商预先考虑的值到列表的开头,它不添加它到列表的末尾。当您这样考虑时,::
运算符是正确的关联这一事实很有意义,因为它会将元素粘贴到的开头List
:
scala> 4 :: List(3,2,1)
res1: List[Int] = List(4, 3, 2, 1)
内部实现非常简单:
def ::[B >: A] (x: B): List[B] =
new scala.collection.immutable.::(x, this)
List
在内部以LinkedList的形式实现,该列表包含一个head(头),该头是集合中的第一个元素,以及一个剩余元素的列表,它们是tail。这就是为什么前置元素比附加元素便宜得多的原因,因为它需要对内部列表进行O(n)遍历才能复制元素,并附加新值。
尽管很昂贵,您仍然可以使用:+
运算符来实现它,它仍然是关联的:
scala> List(1,2,3) :+ 4
res3: List[Int] = List(1, 2, 3, 4)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句