scala中的低优先级和高优先级含义

时间:2017-11-16 21:41:43

标签: scala implicit

在以下来自Scala的益智游戏的代码中,似乎没有冲突的冲突,因为TestAlarmHandler更具体。我不明白这个解释。为什么TestAlarmHandlerDefaultAlarmHandler更具体?

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!

2 个答案:

答案 0 :(得分:1)

TestAlarmHandlerDefaultAlaramHandler更具体,因为TestAlarmHandler是在匿名类中定义的,该类派生自定义OperatingMode的类DefaultAlarmHandler

正式地,the Scala Language Specification指定了在找到多个符合条件的参数时如何处理案例,如下所示(请注意,TestAlarmHandlerDefaultAlarmHandler都符合条件,因为它们已被导入import TestMode._):

  

如果有几个符合条件的参数与隐式参数的类型匹配,则将使用静态重载分辨率的规则选择最具体的参数。

6.26.3 Overloading Resolution节根据相对权重的概念定义更具体的概念:

  

替代A的替代A的相对权重是从0到2的数字,定义为

的总和      
      
  • 1如果A与B一样具体,否则为0,
  •   
  • 1如果A在类或对象中定义,该类或对象派生自定义B的类或对象,否则为0。
  •   

TestAlarmHandler相对于DefaultAlarmHandler的相对权重为1,而DefaultAlarmHandler相对于TestAlarmHandler的相对权重为0.请注意,TestAlarmHandler是在匿名类中定义的它源自定义OperatingMode的类DefaultAlarmHandler。解决方法重载时,第一条规则值得关注,但这里不相关。

  

如果A对B的相对权重大于B对A的相对权重,则备选A 比其他B更具体

TestAlarmHandlerDefaultAlaramHandler更具体,因为TestAlarmHandler相对于DefaultAlarmHandler的相对权重大于反$scope.widget = { title: 'abc', content: 'test' };

答案 1 :(得分:0)

那是因为TestMode是OperationMode的子类,scala首先在TestMode的范围内查找implicits,并且只有在未找到它时才会在层次结构中查找。