了解Scala中的对象导入

时间:2019-09-04 03:39:17

标签: scala

根据线程Using implicit objects within classes

中接受的答案

如果隐式对象封装在通用类型的伴随对象中,则无需从对象中显式导入属性和行为。

使用这种逻辑,我无法理解为什么删除导入编号后无法编译下面的代码_

@ViewChild(FormGroupDirective) formDirective: FormGroupDirective;

submitBtnClick() {
  this.formDirective.resetForm();
}

有人可以对此概念有所启发吗?

1 个答案:

答案 0 :(得分:1)

因为从gt导入的toDoublenum的使用不在隐式位置-即toDouble被显式使用,sortWith自变量没有标记为隐式-因此隐式解析不适用于他们。

因此,import num._基本上放入稍后使用的 explicit 范围方法,特别是num.gt和另一个具有Numeric[T].Ops实现的隐式toDouble

考虑以下示例-重写median,以使用对使用隐式分辨率的函数的调用来替换这两个显式使用:

implicit class GenericMedian[T: Numeric](seq: Seq[T]) {
  def median(): Double = {
    val medianPosition = seq.length / 2
    sortWithImpl(seq) match {
      case x if x.length % 2 != 0 => makeDouble(x(medianPosition))
      case x => (
        makeDouble(x(medianPosition)) +
        makeDouble(x(medianPosition - 1))
      ) / 2
    }

  }
  private def makeDouble(t: T)(implicit numeric: Numeric[T]): Double = numeric.toDouble(t)

  private def sortWithImplicit(seq: Seq[T])(implicit numeric: Numeric[T]): Seq[T] = seq.sortWith(numeric.gt)
}

请注意,没有numeric实例从隐式作用域makeDouble变出,并且sortWithImplicit使用隐式解析。

为更深入地了解,请考虑咨询scala docs on implicitsthis answer(特别是“访问由上下文绑定引入的隐式参数”一节)