Scala 在导入“我的对象”时,使来自不同对象的隐式对象可访问
当有人导入我的对象时,我希望其他对象(或包)中的一些隐式类对他们可用。在对象中具有Scala 在导入“我的对象”时,使来自不同对象的隐式对象可访问,scala,import,implicit,Scala,Import,Implicit,当有人导入我的对象时,我希望其他对象(或包)中的一些隐式类对他们可用。在对象中具有import没有帮助,因为导入不是传递性导入的,因此我假设我必须使用一些隐式def或val,但是我找不到合理的方法来实现这一点,只有非常详细的def: object Main extends App { object A { implicit class ExtendedMath(val x: Double) extends AnyVal { def square = x * x
import
没有帮助,因为导入不是传递性导入的,因此我假设我必须使用一些隐式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所建议的,典型的方法是定义一个特征中的隐含成分,然后你可以将其多次混合。唯一需要注意的是,trait中不允许使用值类,因此您必须采用分离值类和隐式转换的方法:
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
}
您可以控制要从中获取隐式的包吗?@m-z在这种情况下,我可以控制,但我可以想象有时有人希望从第三方包中转发隐式。将隐式转换为由两个对象扩展的特征“因此您必须采用分离值类和隐式转换的方法:”-鉴于此负担不在对象的用户身上,我认为这是可以接受的。如果这是一种“典型的方法”,它有什么名字吗?@Suma我不知道这种方法有什么特别的名字。但是我已经看过很多次了,所以它很常见。