스칼라에서 '20 초 '는 어떻게 작동합니까?


130

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

import scala.concurrent.duration._

val time = 20 seconds

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

답변:


171

몇 가지 일이 있습니다.

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

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

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

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

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


83
충분히 진보 된 기술은 마술과 구별 할 수 없습니다.
ripper234

4
다행히도 대부분의 IDE가이를 구별 할 수 있습니다! 스칼라에서는 암시 적 변환이 상당히 많이 사용됩니다. 텍스트 파일을 읽는 것만으로도 혼란 스러울 수 있지만 ( "어떻게 그 방법이 나오는지") 적절한 도구 지원을 통해 스칼라가 아름답고 간결 할 수있는 방법을 찾을 수 있어야합니다. (예를 들어 20. 초는 그 new DurationInt(20).seconds()방법을 아는 한 훨씬 읽기 쉽습니다 )
William Billingsley

1
암시 적을 사용하여 자신을 찾으면 항상 도움없이 동일한 것을 달성 할 수있는 방법이 있는지 스스로에게 물어보십시오. twitter.github.com/effectivescala/#Types 및 Generics-Implicits
oluies

4
실제로 seconds메소드는 parens없이 정의되므로 parens를 사용하여 호출하면 오류가 발생합니다.
Frank S. Thomas

1
@ 프랭크 좋은 지적입니다. 20.seconds()스칼라로 작성할 수 있다고 제안하는 것은 아니며 컴파일러가 호출을 그런 식으로 번역하고 있다는 것만 의미합니다. 이 경우와 같이 해당 메소드에 매개 변수 목록이없는 경우 스칼라 에서는 parens를 생략 해야 합니다.
Aaron Novstrup 2013

7

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


1
가져 오기가 import scala.concurrent.duration._해결 20 seconds되지만 실제로 DurationConversions속성을 가져 오는 이유 는 무엇입니까? 편집 : 그들이 실제로 가져오고있는 것을 깨달았습니다 DurationInt. 실제 특성을 가져올 수 없기 때문입니다. Trait의 구체적인 구현 만?
Franklin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.