2009-11-30 2 views
4

라이브러리 작동 방식을 파악할 때 암시 적 변환이 혼란 스럽습니다. 예를 들어, 'val foo : Foo = 1'과 같은 표현식을 보면, 1을 Foo로 변환하는 것은 무엇입니까?scala : 추적 implicits 선택 및 기타 코드 마법

표현식을 평가하는 동안 실행중인 코드 경로를 인쇄하도록 스칼라 라이브러리 (또는 REPL)에 지시 할 수 있습니까?

답변

7

컴파일러 명령 줄에 "-Xprint : typer"를 추가하거나 (스윙 GUI 브라우저의 경우 "-Ybrowse : typer") 명시 적으로 적용한 변환 코드를 볼 수 있습니다.

+0

당신이 스윙 GUI 브라우저에서 무엇을 의미합니까 :

class A{ val x : String = "hi" drop 1 } 

가 될 것인가? –

+0

Swing = 자바 클라이언트 측 GUI 위젯. GUI = 그래픽 사용자 인터페이스. "Swing GUI Browser"= 확장 가능한 트리 컨트롤이있는 못생긴 대화 상자. –

3

변환을 인쇄하는 대신에 어둠이 단지 어둠으로부터 나올 수 없음을 깨달아야합니다. 당신은 어떤 방법으로 그것들을 범위 안으로 가져와야합니다. 대안은 다음과 같습니다 :

  1. 명시 적 import 문. y이 객체 일 때 import x.y._을주의하십시오. 이는 암시 적 범위로 가져 오는 유일한 방법이므로주의해야합니다.
  2. 다른 것으로 변환되는 클래스의 오브젝트 컴패니언.
  3. 대상이 어떤 식 으로든 명시 적으로 지정되는 한 (예 : 사용자의 경우와 같이) 대상 클래스의 개체 도우미입니다.

개체 scala.Predef은 기본적으로 범위로 가져 오기됩니다. 스칼라의 기본 implicits가 범위로 ​​들어가는 방식입니다.

+0

약 (1). 사실,이 질문은 scalacheck을 사용하려면 org.scalacheck._를 가져온 다음 val 모음과 같은 것을 할 수 있다는 사실에서 유래합니다 : Gen [Char] = 'A'| 'E'| 'I'| ' O '|'U '|'Y ''로 암시 적 변환을 사용합니다. scalacheck 파일 중 하나에 'import Gen. {값, ...}'이 있습니다 (값은 변환을 수행하는 암시 적 메서드입니다). – IttayD

+0

가져 오기가 관련성이 있는지 의심 스럽습니다. 나는이 경우 묵시적으로 겐의 대상 동반자를 들여다 볼 것이다. –

+0

네, 동반자 오브젝트에서 왔습니다. 그러나 가져 오기 위해 'org.scalacheck.Gen._ import'를 할 필요가 없었습니다. 암시 적으로 가져 오기가 암시 적으로 완료되었습니다 (말장난 의도) – IttayD

0

scalac -print은 암시 적 유형 변환이 적용된 후 코드를 인쇄합니다.

package <empty> { 
    class A extends java.lang.Object with ScalaObject { 
    @remote def $tag(): Int = scala.ScalaObject$class.$tag(A.this); 
    private[this] val x: java.lang.String = _; 
    <stable> <accessor> def x(): java.lang.String = A.this.x; 
    def this(): A = { 
     A.super.this(); 
     A.this.x = scala.this.Predef.forceRandomAccessCharSeq(
     scala.this.Predef.stringWrapper("hi").drop(1)); 
    () 
    } 
    } 
}