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

Scala隐式参数,其默认值在伴随对象中定义,scala,scope,implicit,Scala,Scope,Implicit,根据Scala规范(2.8),要找到隐式,必须在本地范围、继承范围或伴生对象中定义隐式。考虑到这一点,在我看来,下面的代码应该在不显式导入伴随对象内容的情况下工作。我在Scala库源代码(例如CanBuildFrom)中看到了这一点。似乎我还应该能够从XX类的定义之外调用XX.foo(),并使用同伴类中的隐式参数。我错过了什么 object XX { implicit def XYZ[T]: (T) => Unit = null } class XX { // import X

根据Scala规范(2.8),要找到隐式,必须在本地范围、继承范围或伴生对象中定义隐式。考虑到这一点,在我看来,下面的代码应该在不显式导入伴随对象内容的情况下工作。我在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
  }
}
对象XX{
隐式定义XYZ[T]:(T)=>Unit=null
}
XX类{
//导入XX.\u//此行未注释。。。
def foo(s:String)(隐式f:(String)=>Unit):Unit={
如果(f==null)
println(“Just:+s)
其他的
f(s)
}
def棒{
foo(“abc”){s=>println(“Func:+s)}

foo(“xyz”)/我总是将规范解释为隐式参数可以在隐式参数的伴随对象中定义,而不是在包含该定义的类中定义。类似如下:

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 可以在 不带前置函数的方法调用,以及 这表示一种隐含的定义 (§7.1)或隐式参数 因此,合格的身份证明可以是当地人 名称,或包含 模板,或者它可能已经制作好了 无需预紧固件即可通过 进口条款(§4.7)。如果没有 本规则下的合格识别人, 那么,第二,符合条件的也都是 某个对象的隐式成员 属于的隐式范围 隐式参数的类型,T.


你能引用表示定义包含类的伴生对象的部分吗?

看来我误解了伴生对象必须与哪个类关联。谢谢你帮我澄清。我正在试图找到一种定义“默认函数”的方法可以传递给另一个函数。但是可以被调用方重写。我假设您的“默认函数”可以作为默认参数实现。