【问题标题】:Defining a variable in scala with two implicits在 scala 中使用两个隐式定义变量
【发布时间】:2016-07-28 11:09:25
【问题描述】:

我在 twitter 上看到了 scalaLang 的一篇有趣的帖子。这段代码在哪里编译和工作

class A(implicit implicit val b: Int) 

val objA = new A()(42)

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

感谢任何帮助!

【问题讨论】:

    标签: scala scala-implicits


    【解决方案1】:

    经过一番挖掘,我确认了@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 表示构造函数参数可以隐式传递;而第二个定义了隐含值——尽管在这种情况下,它们做同样的事情。

    【讨论】:

    • 如果我错了,请纠正我,但 foo 隐含地采用 m,它被 n ==m 的事实所掩盖。 n 没有声明为隐式,因此不能这样使用,而且如果在同一范围内声明两个相同类型的隐式值,编译器会因为歧义而引发错误
    • 你是对的。我从 IDE 复制了错误的代码。我会更新答案。编辑:更新。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多