Scala隐式参数,其默认值在伴随对象中定义
根据Scala规范(2.8),要找到隐式,必须在本地范围、继承范围或伴生对象中定义隐式。考虑到这一点,在我看来,下面的代码应该在不显式导入伴随对象内容的情况下工作。我在Scala库源代码(例如CanBuildFrom)中看到了这一点。似乎我还应该能够从XX类的定义之外调用XX.foo(),并使用同伴类中的隐式参数。我错过了什么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
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.
你能引用表示定义包含类的伴生对象的部分吗?看来我误解了伴生对象必须与哪个类关联。谢谢你帮我澄清。我正在试图找到一种定义“默认函数”的方法可以传递给另一个函数。但是可以被调用方重写。我假设您的“默认函数”可以作为默认参数实现。