如何在混合时获得隐式和显式相同的值以对齐
How to get implicit and explicit identical value to align when both being mixed in
假设以下情况
我有一个特征 A 和一个特征 B,它们都声明了一个具有相同名称和类型的值。
A显式定义值,B隐式定义值
A 和 B 来自外部库,无法更改。我不想分叉。
我想在我自己的代码中的 class C 中同时使用它们
如何让它们在 class C 中对齐?
我希望 B.foo 成为 A.foo
的值
// External code, cant touch
trait A{
val foo = "boom"
}
trait B{
implicit val foo: String
}
// My class
class C extends A with B {
//uh oh??
}
更新(在 Jasper-M 的帮助下)
// External code, cant touch
trait A{
val foo = "boom"
}
trait B{
implicit val foo: String
def implBang()(implicit s: String) = s
def doTheBang() = implBang()
}
// My class
class C extends B with A {}
new C().doTheBang; // Prints "boom"
现在只剩下一个问题了,我怎样才能让 foo 进入 class C 的隐式作用域?
您可以只覆盖 implicit
变量,例如:
// My class
class C extends A with B {
override implicit val foo = "My Value"
}
理想情况下,您可以 select 使用 super[Name]
实现您想要的实现。但是对于不起作用的 vals for some reason.
class C extends A with B {
override implicit val foo = super[A].foo
// error: super may not be used on value foo
}
因此,如果您真的需要 C
中的一些隐式 String
,我建议只让线性化完成它的工作并定义另一个隐式 val。
class C extends A with B {
implicit val bar = foo
}
假设以下情况
我有一个特征 A 和一个特征 B,它们都声明了一个具有相同名称和类型的值。
A显式定义值,B隐式定义值
A 和 B 来自外部库,无法更改。我不想分叉。
我想在我自己的代码中的 class C 中同时使用它们
如何让它们在 class C 中对齐? 我希望 B.foo 成为 A.foo
的值// External code, cant touch
trait A{
val foo = "boom"
}
trait B{
implicit val foo: String
}
// My class
class C extends A with B {
//uh oh??
}
更新(在 Jasper-M 的帮助下)
// External code, cant touch
trait A{
val foo = "boom"
}
trait B{
implicit val foo: String
def implBang()(implicit s: String) = s
def doTheBang() = implBang()
}
// My class
class C extends B with A {}
new C().doTheBang; // Prints "boom"
现在只剩下一个问题了,我怎样才能让 foo 进入 class C 的隐式作用域?
您可以只覆盖 implicit
变量,例如:
// My class
class C extends A with B {
override implicit val foo = "My Value"
}
理想情况下,您可以 select 使用 super[Name]
实现您想要的实现。但是对于不起作用的 vals for some reason.
class C extends A with B {
override implicit val foo = super[A].foo
// error: super may not be used on value foo
}
因此,如果您真的需要 C
中的一些隐式 String
,我建议只让线性化完成它的工作并定义另一个隐式 val。
class C extends A with B {
implicit val bar = foo
}