中缀符号有时在scala中不起作用,为什么会这样?

时间:2013-05-09 18:06:12

标签: list scala

好吧,所以我正在做一些测试以熟悉Scala,并希望看看我是否可以创建Java样式列表而不是你在Scala中使用它的奇特方式......

我知道你可以这样做:val lst = List.range(0, 100, 1)但我只想看看scala中的java风格是什么样的

好吧,这就是我的所作所为:

var lst = List[Int]()

for(i <- 0 until 100) {
    lst = lst :: i // here's where it complains
}

由于某种原因scala,或者至少scclipse的eala不喜欢我使用中缀符号附加,a-la lst :: i它要我这样做:lst.::(i)否则它说::没有定义或什么,它不是第一次发生......

所以这里的任何人都可以解释为什么会这样做,或者它只是在eclipse中执行不良的情况,因此我必须忍受

2 个答案:

答案 0 :(得分:7)

这不是中缀表示法的问题。相反,这是因为以:结尾的方法名称被应用为

a ??: b
b.??:(a)

所以你只是向后反驳你的论点。

lst = i :: lst

会正常工作。

(当然,你的问题就是列表就像堆栈一样,所以你需要按相反的顺序推送数字。)

答案 1 :(得分:0)

在Scala中,List具有不可变长度。它可以像LIFO(后进先出)结构一样工作,但它的行为不像Java ArrayList

你这样做:

val lst = List[Int]()

使lst的大小为0。这意味着你无法用它做任何事情。

对于可变集合,请使用ListBuffer

此外,::运算符是右关联的,这意味着它将在运算符右侧的对象上调用。

val lst = ListBuffer[Int]()

for (i <- 0 until 100) {
    lst += i // will add to the tail.
}