我可以在Scala 3中显式导入扩展方法吗?

js81xvg6  于 2023-04-21  发布在  Scala
关注(0)|答案(1)|浏览(122)

给定一个使用implicit class语法定义的扩展方法:

package casa

object MyExtensions:
  implicit class IntOps(val underlying: Int):
    def twice: Int = underlying * 2

  implicit class StringOps(val underlying: String):
    [...]

我可以显式地导入它并将其与

@main def double(): Unit = {
  import casa.MyExtensions.IntOps
  println(s"2 * 2 = ${2.twice}")
}

但是当我使用Scala 3的extension语法时:

package casa

object MyExtensions:
  extension (underlying: Int)
    def twice: Int = underlying * 2

  extension (underlying: String)
    [...]

我似乎必须通配符导入扩展:

@main def double(): Unit = {
  import casa.MyExtensions.*
  println(s"2 * 2 = ${2.twice}")
}

是否有一种方法可以显式地只导入特定的扩展名?

kkbh8khc

kkbh8khc1#

不确定这个特性出现在哪个版本,或者它是否一直存在,但是是的,你可以导入一个扩展方法

object MyExtensions:
  extension (underlying: Int)
    def twice: Int = underlying * 2

  extension (underlying: String)
    def foo: Unit = ()

def test() =
  import MyExtensions.twice
  2.twice // compiles
  "a".foo // doesn't compile

使用import MyExtensions.*可以导入所有这些。
在Scala 3.2.1中测试。

相关问题