2017-10-15 18 views
0

컴파일 할 때 List Buffer 요소에 의존하는 scala step definiton 파일의 시작 부분에 Private Constants를 지정하는 문제가 발생합니다. 'IndexOutOfBoundsException': 목록이 처음에는 비어 있고 for 루프에서 나중에 채워지기 때문입니다. 예를 들어 나는 다음과 같은 2 개 상수있다 :채울 목록 버퍼에 의존하는 상수 액세스 Scala

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

globalExampleList 더 아래 파일에 채워지는 루프의 사용 :

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 
} 

그러나 ConstantVal1, ConstantVal2는 여전히 원래의 기본 값을 갖게됩니다. 따라서 이들을 var으로 만들고 버퍼를 채운 후에 다시 할당 할 수 있습니다.

코드에 많은 돌연변이와 부작용이있는 것 같습니다.

+0

감사합니다 :) 거기에는 돌연변이와 부작용이없는 더 나은 방법이 있지만 여전히 같은 결과를 얻을 수 있습니다. 스칼라에서 코드를 작성할 수있는 가장 좋은 방법을 배우는 Im, 어떤 정보도 다음에서 배울 수 있습니다. – user610

1

두 가지 방법이 있습니다. 먼저 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)