복붙노트

[SCALA] 스칼라 : 암시 적 매개 변수 해상도 우선 순위

SCALA

스칼라 : 암시 적 매개 변수 해상도 우선 순위

우리는 로컬 범위와 관련된 암시 적 매개 변수 조회가 있다고 가정 :

trait CanFoo[A] {
  def foos(x: A): String
}

object Def {
  implicit object ImportIntFoo extends CanFoo[Int] {
    def foos(x: Int) = "ImportIntFoo:" + x.toString
  }
}

object Main {
  def test(): String = {
    implicit object LocalIntFoo extends CanFoo[Int] {
      def foos(x: Int) = "LocalIntFoo:" + x.toString
    }
    import Def._

    foo(1)
  }

  def foo[A:CanFoo](x: A): String = implicitly[CanFoo[A]].foos(x)
}

위의 코드에서, LocalIntFoo는 ImportedIntFoo 이긴다. 누군가가 "정적 과부하 해상도 (§6.26.3)의 규칙"을 사용하여 더 많은 특정을 고려 어떻게 설명 할 수 있을까요?

편집하다:

이름 바인딩 우선 순위는 설득력있는 주장이지만, 해결되지 않은 몇 가지 문제가있다. 첫째, 스칼라 언어 참조 말한다 :

둘째, 결합 우선 이름이 범위 인 경우에, 특정 회원 pkg.A.B.x 식별자에 X가있는 알려진 여러 변수 / 방법 / 객체라는 X를 해결하는 방법에 대한 것이다. ImportIntFoo 및 LocalIntFoo는 같은 이름되지 않습니다.

셋째, 나는 다음과 같이 혼자 그 이름 바인딩 우선 순위가 플레이에없는 표시 할 수 있습니다 :

trait CanFoo[A] {
  def foos(x: A): String
}

object Def {
  implicit object ImportIntFoo extends CanFoo[Int] {
    def foos(x: Int) = "ImportIntFoo:" + x.toString
  }
}

object Main {
  def test(): String = {
    implicit object LocalAnyFoo extends CanFoo[Any] {
      def foos(x: Any) = "LocalAnyFoo:" + x.toString
    }

    // implicit object LocalIntFoo extends CanFoo[Int] {
    //   def foos(x: Int) = "LocalIntFoo:" + x.toString
    // }
    import Def._

    foo(1)
  }

  def foo[A:CanFoo](x: A): String = implicitly[CanFoo[A]].foos(x)
}

println(Main.test)

test.scala 및 실행 스칼라 test.scala에 넣고, 그것은 ImportIntFoo에서 인쇄 : 1. 정적 과부하 해상도 (§6.26.3)이 더 특정 유형의 승리라고하기 때문입니다. 우리 모두가 자격이 암시 값이 동일한 명명 된 척하는 경우, LocalAnyFoo는 ImportIntFoo를 마스크해야합니다.

관련 :

이 암시 적 매개 변수 해상도의 큰 요약이지만, 스펙 대신 조쉬의 nescala 발표를 인용한다. 그의 이야기는이 조사 나에게 동기를 부여하는 것이다.

컴파일러 구현

해결법

  1. ==============================

    1.나는 수입 세금없이 implicits를 다시 방문 블로그 포스트의 형태로 내 자신의 대답을 썼다.

    나는 수입 세금없이 implicits를 다시 방문 블로그 포스트의 형태로 내 자신의 대답을 썼다.

    업데이트 : 또한, 위의 게시물에 마틴 오더 스키에서 코멘트 ImportedIntFoo 이상 경력 LocalIntFoo의 스칼라 2.9.1의 행동이 버그가 사실이라고 밝혔다. 다시 암시 적 매개 변수 우선 순위를 참조하십시오.

    어느 단계에서 우리는 하나의 암시 적 정적 오버로드 규칙보다 더 찾을 경우이를 해결하는 데 사용됩니다.

    업데이트 2 : 내가 가져 오기 세금없이 Implicits에 대한 조쉬 물었을 때, 그는 정확히 같은 이름이 지정됩니다 implicits 규칙을 바인딩의 이름을 언급했다 나에게 설명했다.

  2. ==============================

    2.http://www.scala-lang.org/docu/files/ScalaReference.pdf에서, 제 2 장 :

    http://www.scala-lang.org/docu/files/ScalaReference.pdf에서, 제 2 장 :

    I는 착각하지만 foo는 (1)에 대한 호출은 그 위에 ImportedIntFoo 변환 우선 촬영 결과 LocalIntFoo 같은 편집 단위이다.

  3. ==============================

    3.아무 메서드 오버로드는 없습니다, 그래서 6.26.3 여기에 완전히 무관하다.

    아무 메서드 오버로드는 없습니다, 그래서 6.26.3 여기에 완전히 무관하다.

    과부하는 같은 이름을 가진 여러 방법을 의미하지만, 다른 매개 변수는 같은 클래스에 정의된다. 예를 들어, 실시 예에서 6.26.1 방법 F는 과부하 :

    class A extends B {}
    def f(x: B, y: B) = . . .
    def f(x: A, y: B) = . . .
    val a: A
    val b: B
    

    암시 적 매개 변수 해상도 우선 순위는 완전히 다른 규칙, 그리고 스택 오버플로 이미 질문과 대답을 가지고 하나.

  4. from https://stackoverflow.com/questions/8623055/scala-implicit-parameter-resolution-precedence by cc-by-sa and MIT license