是否可以在Scala中创建一个未命名的隐式类或函数?
例如,如果我有以下隐式类:
implicit class ListIntExtras(list: List[Int]) {
def average = list.sum / list.size
}
我希望能够将其定义为类似implicit class _(list: List[Int])
的内容,因为类ListIntExtras
的名称实际上从未在任何地方使用过。
隐含功能也是如此:
implicit def intToDouble(i: Int): Double = i.toDouble
我想将该方法定义为implicit def _(i: Int): ...
,因为我再也没有引用它的实际名称。
我知道这对于隐式val
是可行的。例如,您可以执行implicit val _ = new Config()
这是有用的,因为将其命名为_
之外的其他内容似乎只是一种浪费,因为它永远不会被名称引用。
答案 0 :(得分:2)
Scala 3(Dotty)提供了专用的extension methods语法,例如,有效避免了必须为隐式类指定名称
scala> extension (list: List[Int])
| def average = list.sum / list.size
|
def extension_average(list: List[Int]): Int
scala> List(1, 41).average
val res0: Int = 21
答案 1 :(得分:1)
不,您无法创建没有标识符的类或方法。它不是有效的语法。
implicit val _ = new Config()
并没有真正按照您的想法行事。下划线用作val的标识符,不能在同一范围内重用。您可以通过名称来引用它:
val a: Config = `_`
然而,在这种情况下(以及大多数其他情况):
implicit val Some(_) = Option(1)
下划线表示不将值分配给任何内容。
没有理由使用标识符无法访问的val或def。如果您担心名称冲突,那么您应该使名称更长,更独特。但是,没有名称会阻止某人进行通配符导入并从作用域中排除一个隐式:
e.g。
import package.MyImplicits.{ badImplicit => _, _}
答案 2 :(得分:0)
这是Typelevel Scala的一个很大的问题:
https://github.com/typelevel/scala/issues/9
棘手的部分是,底层隐式必须有一个名称,那么如何生成一个有用的名称?它不能是一个新名称,因为您希望它在编辑中保持稳定,而不受文本顺序的影响。也许名字会对其签名进行编码;虽然有时你也想在范围上含糊不清。