为什么我不能在列表之后使用::在Scala中为它追加一个字符串?

时间:2012-03-29 14:12:06

标签: scala syntax

所以我认为我的问题与幕后发生的事情有关,但我不明白为什么这不起作用:

scala> b = b :: "apple";
<console>:8: error: value :: is not a member of java.lang.String

但这样做:

scala> b = "apple" :: b;
b: List[java.lang.String] = List(apple, pear)

感谢。

3 个答案:

答案 0 :(得分:8)

:结尾的方法名称是右关联的,因此b :: "apple"尝试在String上调用::方法,该方法不存在。

如果必须使用List,附加内容的正常策略是在开始时添加内容,然后在完成后reverse结果。但正如Rex所说,使用Vector可能会更好。

答案 1 :(得分:6)

::始终将新项目添加到列表的开头。可以在最后添加一个项目,但是它需要与列表长度成比例的时间(因为整个列表不仅必须遍历,而且实际上也必须重建)。

如果您确实必须在列表末尾添加项目,请使用:+

List("pear","orange") :+ "apple"

更好的是,当你需要添加到最后时使用Vector(在双端添加时速度要快得多):

Vector("grape","peach") :+ "apple"

答案 2 :(得分:0)

另一种可能性是明确地将Nil添加到链的末尾:

scala> val a = "apple"
a: java.lang.String = apple

scala> val b = "pear"
b: java.lang.String = pear

scala> a::b::Nil
res0: List[java.lang.String] = List(apple, pear)