2016-03-02 54 views
0

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

回答

1

不,您不能创建没有标识符的类或方法。这是无效的语法。

implicit val _ = new Config()并不真正做你认为它做的事情。下划线被用作val的标识符,它不能在相同的范围内重用。你可以参考它的名字:

val a: Config = `_` 

然而,在这样的情况下(和其他大多数):

implicit val Some(_) = Option(1) 

下划线的意思赋值到任何东西。

没有理由有一个val或def,你不能通过标识符。如果您担心名称冲突,那么您应该使名称更长,更独特。但是,没有名称会阻止某人进行通配符导入,并且排除单个隐含范围:

例如,

import package.MyImplicits.{ badImplicit => _, _} 
+0

请注意'隐式val _ = new Config'确实有效,只是不在试图绑定符号的REPL中。无论如何,如果你这样做,隐式没有找到,因为它没有符号。 –

+0

它看起来像'隐式val _'实际上工作。我已经在我的项目中使用了它,它使用了case jquery类的'Format'属性的Play json库('implicit val _ = Json.format [A]')。删除那给出了一个错误,说它无法找到A类的格式。 – socom1880

+0

@ socom1880我修复了这个部分,但并没有改变整体的答案。 val仍然有一个标识符。 –

0

这是一个很大的要求,在Typelevel斯卡拉:

https://github.com/typelevel/scala/issues/9

最棘手的部分是,潜在的隐性必须有一个名字,那么你如何生成一个名称,有用?它不能是一个全新的名字,因为您希望它在整个编辑过程中保持稳定,并且不受文本顺序的影响。也许这个名字会将其签名编码;尽管有时候你也想在范围上隐含含糊不清的含义。

相关问题