在scala中定义带有两个含义的变量

时间:2016-07-28 11:09:25

标签: scala scala-implicits

我在scalaLang的Twitter上发现了一篇有趣的帖子。此代码编译和工作的地方

class A(implicit implicit val b: Int) 

val objA = new A()(42)

有人可以解释一下它是如何工作的吗?我阅读了implicits的文档,但没有找到这样的案例。请解释一下这里发生了什么。

感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

经过一番挖掘,我确认了@Alexey Romanov所说的话。请考虑以下示例:

case class A(implicit implicit val a: Int)

def foo(x: Int)(implicit y: Int): Int = x * y

我们可以像这样使用它:

implicit val m: Int = 2
val myA = A()

以下申请:

val myAA = A()(2)
val n = myAA.a 
foo(3)

现在,foo(3)显然会产生6,因为隐式地需要n。如果我们将课程改为

case class A(implicit val a: Int)

它不会改变foo的行为。因此,我们得出相同的结论,即@Alexey - first implicit表示构造函数参数可以隐式传递;而第二个定义了隐含价值 - 即使在这种情况下,他们做同样的事情。

答案 1 :(得分:2)

您可以在类或方法的最后一个参数列表之前,也可以在类或特征的任何成员之前拥有implicit。这简单地结合了两者,这可能是合法的,因为禁止它会使语言规范和解析器稍微复杂一点,没有真正的好处。我认为没有任何理由可以使用这个或任何差异来写implicit一次。