스칼라의 수수께끼에 나오는 코드에서 TestAlarmHandler
이 더 구체적이기 때문에 암시 적으로 충돌이없는 것으로 보입니다. 나는 설명을 이해하지 못했다. TestAlarmHandler
이 DefaultAlarmHandler
보다 구체적 인 이유는 무엇입니까? TESTMODE이 OperationMode의 서브 클래스, 그리고 스칼라는 TESTMODE의 범위 implicits에 대한 첫번째보기에 있습니다 만 발견되지 않는 경우는이 계층 구조에서 조회하기 때문이다우선 순위가 낮고 우선 순위가 높은 스칼라 문자
object Scanner {
trait Console { def display(item: String) }
trait AlarmHandler extends (() => Unit)
def scanItem(item: String)(implicit c: Console) {
c.display(item)
}
def hitAlarmButton()(implicit ah: AlarmHandler) { ah() }
}
class OperatingMode {
implicit val ConsoleRenderer = new Scanner.Console {
def display(item: String) { println(s"Found a ${item}") }
}
implicit val DefaultAlarmHandler = new Scanner.AlarmHandler {
def apply() { println("ALARM! ALARM!") }
}
}
object NormalMode extends OperatingMode
object TestMode extends OperatingMode {
override implicit val ConsoleRenderer = new Scanner.Console {
def display(item: String) { println("Found a detonator") }
}
implicit val TestAlarmHandler = new Scanner.AlarmHandler {
def apply() { println("Test successful. Well done!") }
}
}
import NormalMode._
scala> Scanner scanItem "knife"
Found a knife
scala> Scanner.hitAlarmButton()
ALARM! ALARM!
import TestMode._
scala> Scanner scanItem "shoe"
Found a detonator
scala> Scanner.hitAlarmButton()
Test successful. Well done!