当我的对象被导入时,使来自不同对象的隐式可访问
Make an implicit from a different object accessible when my object is imported
当有人导入我的对象时,我希望其他对象(或包)中的一些隐式 类 可供他们使用。在对象中包含 import
没有帮助,因为导入不是传递导入的,因此我假设我必须使用一些 implicit
def
或 val
,但是我无法找到一些合理的方法如何实现这一点,只有一个相当冗长 def
:
object Main extends App {
object A {
implicit class ExtendedMath(val x: Double) extends AnyVal {
def square = x * x
}
}
object X {
import A._
// what to write here, so that ExtendedMath is forwarded to our users?
// following works, but it seems quite verbose
implicit def extendedMath(x: Double): ExtendedMath = ExtendedMath(x)
}
import X._
val a = 0.0
println(a.square)
}
有没有更简洁的方法?
正如@stew 所建议的,典型的方法是在特征中定义隐式,然后您可以将其混合多次。唯一需要注意的是特征中不允许使用值 classes,因此您必须求助于分离值 class 和隐式转换:
class ExtendedMath(val x: Double) extends AnyVal {
def square = x * x
}
trait HasMath {
// note: method name somehow must not shadow
// value class name, therefore we use lower-case
implicit def extendedMath(x: Double): ExtendedMath = new ExtendedMath(x)
}
object A extends HasMath
object X extends HasMath
object Test {
import X._
4.0.square
}
当有人导入我的对象时,我希望其他对象(或包)中的一些隐式 类 可供他们使用。在对象中包含 import
没有帮助,因为导入不是传递导入的,因此我假设我必须使用一些 implicit
def
或 val
,但是我无法找到一些合理的方法如何实现这一点,只有一个相当冗长 def
:
object Main extends App {
object A {
implicit class ExtendedMath(val x: Double) extends AnyVal {
def square = x * x
}
}
object X {
import A._
// what to write here, so that ExtendedMath is forwarded to our users?
// following works, but it seems quite verbose
implicit def extendedMath(x: Double): ExtendedMath = ExtendedMath(x)
}
import X._
val a = 0.0
println(a.square)
}
有没有更简洁的方法?
正如@stew 所建议的,典型的方法是在特征中定义隐式,然后您可以将其混合多次。唯一需要注意的是特征中不允许使用值 classes,因此您必须求助于分离值 class 和隐式转换:
class ExtendedMath(val x: Double) extends AnyVal {
def square = x * x
}
trait HasMath {
// note: method name somehow must not shadow
// value class name, therefore we use lower-case
implicit def extendedMath(x: Double): ExtendedMath = new ExtendedMath(x)
}
object A extends HasMath
object X extends HasMath
object Test {
import X._
4.0.square
}