【发布时间】:2017-11-18 01:37:22
【问题描述】:
在以下来自 Scala 的谜题的代码中,似乎没有隐含冲突,因为 TestAlarmHandler 更具体。虽然我没看懂解释。为什么TestAlarmHandler 比DefaultAlarmHandler 更具体?
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!
【问题讨论】: