在Scala中创建未命名的隐式类或函数?

时间:2016-03-02 21:11:18

标签: scala function class implicit anonymous-methods

是否可以在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()这是有用的,因为将其命名为_之外的其他内容似乎只是一种浪费,因为它永远不会被名称引用。

3 个答案:

答案 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

棘手的部分是,底层隐式必须有一个名称,那么如何生成一个有用的名称?它不能是一个新名称,因为您希望它在编辑中保持稳定,而不受文本顺序的影响。也许名字会对其签名进行编码;虽然有时你也想在范围上含糊不清。