在Scala中创建未命名的隐式类或函数?
问题描述:
是否有可能在Scala中创建一个未命名的隐式类或函数?在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()
,这很有用,因为将其命名为_
以外的东西似乎只是一种浪费,因为它永远不会被名称引用。
答
不,您不能创建没有标识符的类或方法。这是无效的语法。
implicit val _ = new Config()
并不真正做你认为它做的事情。下划线被用作val的标识符,它不能在相同的范围内重用。你可以参考它的名字:
val a: Config = `_`
然而,在这样的情况下(和其他大多数):
implicit val Some(_) = Option(1)
下划线的意思不赋值到任何东西。
没有理由有一个val或def,你不能通过标识符。如果您担心名称冲突,那么您应该使名称更长,更独特。但是,没有名称会阻止某人进行通配符导入,并且排除单个隐含范围:
例如,
import package.MyImplicits.{ badImplicit => _, _}
答
这是一个很大的要求,在Typelevel斯卡拉:
https://github.com/typelevel/scala/issues/9
最棘手的部分是,潜在的隐性必须有一个名字,那么你如何生成一个名称,有用?它不能是一个全新的名字,因为您希望它在整个编辑过程中保持稳定,并且不受文本顺序的影响。也许这个名字会将其签名编码;尽管有时候你也想在范围上隐含含糊不清的含义。
请注意'隐式val _ = new Config'确实有效,只是不在试图绑定符号的REPL中。无论如何,如果你这样做,隐式没有找到,因为它没有符号。 –
它看起来像'隐式val _'实际上工作。我已经在我的项目中使用了它,它使用了case jquery类的'Format'属性的Play json库('implicit val _ = Json.format [A]')。删除那给出了一个错误,说它无法找到A类的格式。 – socom1880
@ socom1880我修复了这个部分,但并没有改变整体的答案。 val仍然有一个标识符。 –