2017-05-13 5 views
0

당신에게 최소한의 예제를 제공합니다 :Def vs. val, 기능적 구문이 Scala.js에서 작동하지 않습니까?

object Main extends JSApp 
{ 
    val someThing: String = determineSomething("test") 

    def main(): Unit = 
    { 
     println(someThing) 
    } 
} 

자, 두 가지 가능성이 여기 : 프로젝트가 다음과 같이 실행하면

private def determineSomething(s: String): String = "succeeded" 

은, 글쎄, 난

말 로그 항목을 얻을

성공

하지만 더 많은 기능 구문 :

private val determineSomething: (s: String) => "succeeded" 

내가

TypeError: this.determineSomething$1 is null 

나는 이것이 (JVM) REPL 같이 일어나는 이유에 궁금 얻을, 두 가지 방법이 완벽하게 정상적으로 작동합니다.

object Main extends JSApp { 
    private val determineSomething: String => String = (s: String) => "succeeded" 

    val someThing: String = determineSomething("test") 

    def main(): Unit = { 
    println(someThing) 
    } 
} 

determineSomething 요구의 선언은 something의 선언 앞에 와서는, 그렇지 않으면 전자는 컴파일러가 후자를 초기화하려고 할 때 초기화되지 않은됩니다

+1

'decideSomething'의 정의는 어디에서 나타 납니까? 'something'의 정의 이후에 나타나면,'decideSomething'이 그 시점에서 초기화되지 않았기 때문일 수도 있습니다. 해당 코드 버전의 전체 코드를 포함 할 수 있습니까? –

+0

@MikeAllen이 대답을하고 받아 들일 것입니다. 나는 이것을 깨닫지 못했고, 단지 기능적인 스칼라가되기를 희망했다. 그것은 당연한 것입니다 만, 컴파일러가 FunctionX라면 "전역 적으로"사용할 수 있어야한다는 것을 컴파일러가 알 수 있다는 인상하에있었습니다. – Sorona

+1

@Sorona 'val'을 사용하면 표현의 오른쪽이 열정적입니다 (즉시) 평가. 그 시간에 존재하지 않으면, 당신은 그것을 부를 수 없습니다. REPL에서는 함수를 먼저 정의했을 것입니다. 그렇지 않으면 실제 코드에서는 반대 방향으로 갈 수 있습니다. 느리게 평가되는'def'는 괜찮지 만'val'은 그렇지 않습니다. :) – Lichtbringer

답변

5

나는 당신이 원하는 것은이 같은 생각합니다.