2013-02-27 4 views

답변

132

몇 가지가 있습니다.

먼저 Scala는 많은 메서드 호출에서 점과 괄호를 생략 할 수 있으므로 20 seconds20.seconds() *와 같습니다.

둘째, "암시 적 변환"이 적용됩니다. 20Int하고 Int는 더 seconds 방법, 당신의 메서드 호출의 범위에 의해 제약을 검색 더불어, Int를 받아 seconds 방법을 가지고 뭔가를 반환하는 암시 적 변환에 대한 컴파일러 검색이 없기 때문에.

범위에 DurationInt을 가져 왔습니다. DurationIntInt 매개 변수가있는 암시 적 클래스이므로 해당 생성자는 암시적인 Int => DurationInt 변환을 정의합니다. DurationInt에는 seconds 메서드가 있으므로 모든 검색 조건을 충족합니다. 따라서 컴파일러에서 호출을 new DurationInt(20).seconds **으로 다시 씁니다.

*이 말은 느슨합니다. seconds 메서드에 매개 변수 목록이 없으므로 은 메서드 호출시을 생략해야하므로 실제로는 20.seconds()이 유효하지 않습니다.

** 실제로는 DurationInt이 값 클래스이기 때문에 컴파일러는 가능한 경우 정수를 래핑하지 않습니다.

+66

충분히 발전된 기술은 마술과 구별 할 수 없습니다. – ripper234

+4

다행히도 대부분의 IDE가이를 구별 할 수 있습니다! 암시 적 변환은 스칼라에서 꽤 많이 사용됩니다. 텍스트 파일을 읽는 중이라면 혼란스러워 할 수 있습니다. ("그 방법은 어디에서 왔습니까?") 적절한 도구 지원을 통해 자신의 길을 찾을 수 있어야합니다. 스칼라는 아름답고 의미 있고 간결 할 수 있습니다. (예를 들어, 20 초가'new DurationInt (20) .seconds()'보다 훨씬 더 읽기 쉽습니다). –

+1

implicits를 사용하여 자신을 발견하면, 도움없이 똑같은 것을 달성하십시오. http://twitter.github.com/effectivescala/#Types 및 Generics-Implicits – oluies

6

거기에서 진행되는 "마법"은 "암시 적 변환"이라고합니다. 암시 적 변환을 가져오고 있으며 일부는 Int (및 Double)와 Duration 사이의 변환을 처리합니다. 그게 당신이 처리하는 것입니다.