首页 文章

Scala隐式参数,默认值在随播对象中定义

提问于
浏览
7

根据Scala Spec(2.8),对于要发现的隐式,它必须在本地范围,继承范围或 companion 对象中定义 . 鉴于此,在我看来,下面的代码应该没有明确导入伴随对象的内容 . 我在Scala库源中看到了这个(例如CanBuildFrom) . 似乎我应该能够从XX类的定义之外调用XX.foo()并使用我所使用的伴随类中的隐式参数 . 我错过了什么?

object XX {
   implicit def XYZ[T]: (T) => Unit = null
}

class XX {
  // import XX._     // Works with this line uncommented...
  def foo(s: String)(implicit f: (String) => Unit): Unit = {
    if (f == null)
      println("Just: " + s)
    else
      f(s)
  }

  def bar {
    foo("abc"){ s => println("Func: " + s)}
    foo("xyz")  // <-- Compile error here: could not find implicit value for parameter f
  }
}

1 回答

  • 9

    我总是将规范解释为隐含可以在隐式参数的伴随对象中定义,而不是包含定义的类 . 像这样的东西:

    object ZZ {
       implicit val xyz: ZZ = new ZZ()
    }
    class ZZ {
      def bar: (String) => Unit = null
    }
    
    class XX {
      def foo(s: String)(implicit f: ZZ): Unit = {
        if (f.bar == null)
          println("Just: " + s)
        else
          f.bar(s)
      }
    
      def bar {
        foo("xyz")
      }
    }
    

    在规范的第7.2节中似乎很清楚:

    有资格传递给类型T的隐式参数的实际参数分为两类 . 首先,符合条件的是所有标识符x,它们可以在方法调用点访问而不需要pre fi x,并且表示隐式定义(第7.1节)或隐式参数 . 因此,符合条件的标识符可以是本地名称,也可以是封闭模板的成员,或者可以通过导入子句(第4.7节)进行预先访问 . 如果此规则下没有合格的标识符,则第二个符合条件的也是属于隐式参数类型T的隐式范围的某个对象的所有隐式成员 .

    你可以引用指示定义的包含类的伴随对象的部分吗?

相关问题