使用两个隐式在 Scala 中定义一个变量
Defining a variable in scala with two implicits
我在推特上发现了一个有趣的 post scalaLang。此代码编译和工作的地方
class A(implicit implicit val b: Int)
val objA = new A()(42)
有人可以向我解释一下它是如何工作的吗?我阅读了 implicits 的文档,但没有找到这样的案例。请向我解释这里发生了什么。
感谢任何帮助!
您可以在 class 或方法的最后一个参数列表之前添加 implicit
,也可以在 class 或特征的任何成员之前添加。这只是将两者结合起来,这可能是合法的,因为禁止它会使语言规范和解析器稍微复杂一些,而没有任何实际好处。我认为没有任何理由使用它或与写 implicit
一次有任何区别。
经过一番挖掘,我确认了@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
。如果我们将 class 更改为
case class A(implicit val a: Int)
它不会改变 foo
的行为。因此,我们得出相同的结论,@Alexey - first implicit
表示可以隐式传递构造函数参数;而第二个定义了隐式值——尽管在这种情况下,它们做同样的事情。
我在推特上发现了一个有趣的 post scalaLang。此代码编译和工作的地方
class A(implicit implicit val b: Int)
val objA = new A()(42)
有人可以向我解释一下它是如何工作的吗?我阅读了 implicits 的文档,但没有找到这样的案例。请向我解释这里发生了什么。
感谢任何帮助!
您可以在 class 或方法的最后一个参数列表之前添加 implicit
,也可以在 class 或特征的任何成员之前添加。这只是将两者结合起来,这可能是合法的,因为禁止它会使语言规范和解析器稍微复杂一些,而没有任何实际好处。我认为没有任何理由使用它或与写 implicit
一次有任何区别。
经过一番挖掘,我确认了@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
。如果我们将 class 更改为
case class A(implicit val a: Int)
它不会改变 foo
的行为。因此,我们得出相同的结论,@Alexey - first implicit
表示可以隐式传递构造函数参数;而第二个定义了隐式值——尽管在这种情况下,它们做同样的事情。