어디에도 함수 ev
을 정의하지 않았습니다. 그렇다면 아래 코드가 어떻게 작동합니까? 함축 된 용어가 사용 범위에 정의되어 있지 않아야합니까?암시 적 함수를 정의하지 않고 전달 및 사용
scala> import scala.reflect.runtime.universe.{ reify, showCode }
import scala.reflect.runtime.universe.{reify, showCode}
scala> def same[T, U](x: U)(implicit ev: U => T): T = ev(x)
same: [T, U](x: U)(implicit ev: U => T)T
scala> showCode(reify(same(2)).tree)
res0: String = $read.same(2)(Predef.$conforms)
그래서 ev
에 의해 제공됩니다
def same[T, U](x: U)(implicit ev: U => T): T = {ev(x)}
same(2) // 2
@TravisBrown 대답을 확장하려면'Int [Long, Int] (2)'를 수행하면'Int'에 정의 된 암시 적으로 호출되는 'int2long'이 정의되어 있기 때문에 여전히 컴파일된다는 것을 알 수 있습니다. 이 일. 이와 같은 마법이 일어날 때, 어떤 implicits가 당신에게 명시 적으로 적용되는지 생각해보십시오. 명시 적으로 그들에게 요청합니다. –
감사합니다 Yuval, 혼란스러운 부분은 컴파일러가'T'를 추론 할 때 (암시 적으로 검색하기 전에)입니다. 이것은 암시적인 $ conforms 메소드가있는 첫 번째 브러시입니다. – Samar