[scala] 스칼라에서 ’20 초 ‘는 어떻게 작동합니까?

다음은 어떻게 컴파일됩니까?

import scala.concurrent.duration._

val time = 20 seconds

실제로 여기서 무슨 일이 일어나고 있습니까?



답변

몇 가지 일이 있습니다.

첫째, 스칼라는 많은 메소드 호출에서 점과 파렌을 생략 할 수 있도록 20 seconds합니다.20.seconds() * .

둘째, “암시 적 변환”이 적용됩니다. 이후 20입니다 Int그리고 Int더없는 seconds방법, 소요 암시 적 변환에 대한 컴파일러 검색 Int반환 뭔가 가지고seconds 당신의 메서드 호출의 범위에 의해 제약을 검색하여, 방법.

DurationInt 를 범위로 가져 왔습니다 . 매개 변수 DurationInt가있는 암시 적 클래스 이므로 Int생성자가 암시 적 Int => DurationInt변환을 정의합니다 . DurationIntseconds그것을 만족하여 모든 검색 기준, 방법. 따라서 컴파일러는 호출을 new DurationInt(20).seconds** 로 다시 작성합니다 .

* 나는 이것을 느슨하게 의미합니다. 20.seconds()때문에 실제로 잘못된 seconds방법은 어떤 매개 변수 목록이 없습니다 따라서는 괄호 해야합니다 메소드 호출에서 생략 .

** 실제로 이것은 DurationInt값 클래스 이기 때문에 사실이 아니므로 가능한 경우 컴파일러는 정수를 줄 바꿈하지 않습니다.


답변

진행중인 “마법”을 “암시 적 변환”이라고합니다. 암시 적 변환을 가져오고 있으며 일부는 Int (및 Double)에서 Duration으로의 변환을 처리합니다. 그것이 당신이 다루고있는 것입니다.


답변