2017-10-15 87 views
0

遇到一个问题,我在一个Scala步骤definiton文件开始时指定了Private Constants,这个文件依赖于一个List Buffer元素来填充,但是当编译时我得到一个'IndexOutOfBoundsException',因为列表最初是空的,只能在稍后的for循环中填充。 例如,我有以下2个常量:访问依赖列表缓冲区填充的常量Scala

private val ConstantVal1= globalExampleList(2) 
private val ConstantVal2= globalExampleList(3) 

globalExampleList填充了这个文件里使用for循环:

for (i <- 1 to numberOfW) { 
    globalExampleList += x.xy } 

根据需要一个全球性的可变此列表缓冲区增加了许多价值ListBuffer。

是否有更好的方法来声明这些常量?我试图在for循环之后声明它们,但其他方法无法访问它们。我在同一个文件中有大约4种不同的方法,它们使用这些值,而不是通过索引访问它,每次我认为最好将它们声明为常量,以便在需要更改时保持整洁和高效。

感谢

回答

1

您可以创建默认值所需的大小的清单缓冲器后来填充它:

val globalExampleList: ListBuffer[Int] = ListBuffer.fill(numberOfW)(0) 

for (i <- 0 until numberOfW) { 
    globalExampleList(i) = x.xy 
} 

ConstantVal1ConstantVal2仍然有原来的默认值。因此,您可以让它们成为var,并在填充缓冲区后重新分配它们。

你的代码似乎有很多突变和副作用。

+0

谢谢:)有没有更好的方式没有突变和副作用,但仍然达到相同的结果。我仍然在学习在Scala中编写代码的最佳方式,所以任何信息都可以从中学习 – user610

1

你有2种方法可以去。 首先,你可以使用lazy修改

private lazy val ConstantVal1= globalExampleList(2) 
private lazy val ConstantVal2= globalExampleList(3) 

或者你也可以写for循环之后的两行。

val globalExampleList = XXXX 
for (i <- 1 to numberOfW) { globalExampleList += x.xy } 
private val ConstantVal1= globalExampleList(2) 
private val ConstantVal2= globalExampleList(3)