방법은 다음과 같은 컴파일을 수행합니다스칼라에서 '20 초 '는 어떻게 작동합니까?
import scala.concurrent.duration._
val time = 20 seconds
실제로 무슨 일이야?
방법은 다음과 같은 컴파일을 수행합니다스칼라에서 '20 초 '는 어떻게 작동합니까?
import scala.concurrent.duration._
val time = 20 seconds
실제로 무슨 일이야?
몇 가지가 있습니다.
먼저 Scala는 많은 메서드 호출에서 점과 괄호를 생략 할 수 있으므로 20 seconds
은 20.seconds()
*와 같습니다.
둘째, "암시 적 변환"이 적용됩니다. 20
는 Int
하고 Int
는 더 seconds
방법, 당신의 메서드 호출의 범위에 의해 제약을 검색 더불어, Int
를 받아 이seconds
방법을 가지고 뭔가를 반환하는 암시 적 변환에 대한 컴파일러 검색이 없기 때문에.
범위에 DurationInt을 가져 왔습니다. DurationInt
은 Int
매개 변수가있는 암시 적 클래스이므로 해당 생성자는 암시적인 Int => DurationInt
변환을 정의합니다. DurationInt
에는 seconds
메서드가 있으므로 모든 검색 조건을 충족합니다. 따라서 컴파일러에서 호출을 new DurationInt(20).seconds
**으로 다시 씁니다.
*이 말은 느슨합니다. seconds
메서드에 매개 변수 목록이 없으므로 은 메서드 호출시을 생략해야하므로 실제로는 20.seconds()
이 유효하지 않습니다.
** 실제로는 DurationInt
이 값 클래스이기 때문에 컴파일러는 가능한 경우 정수를 래핑하지 않습니다.
거기에서 진행되는 "마법"은 "암시 적 변환"이라고합니다. 암시 적 변환을 가져오고 있으며 일부는 Int (및 Double)와 Duration 사이의 변환을 처리합니다. 그게 당신이 처리하는 것입니다.
충분히 발전된 기술은 마술과 구별 할 수 없습니다. – ripper234
다행히도 대부분의 IDE가이를 구별 할 수 있습니다! 암시 적 변환은 스칼라에서 꽤 많이 사용됩니다. 텍스트 파일을 읽는 중이라면 혼란스러워 할 수 있습니다. ("그 방법은 어디에서 왔습니까?") 적절한 도구 지원을 통해 자신의 길을 찾을 수 있어야합니다. 스칼라는 아름답고 의미 있고 간결 할 수 있습니다. (예를 들어, 20 초가'new DurationInt (20) .seconds()'보다 훨씬 더 읽기 쉽습니다). –
implicits를 사용하여 자신을 발견하면, 도움없이 똑같은 것을 달성하십시오. http://twitter.github.com/effectivescala/#Types 및 Generics-Implicits – oluies