加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 明确的Subimplicits

发布时间:2020-12-16 18:30:04 所属栏目:安全 来源:网络整理
导读:请考虑以下代码: class A { def print = println("A") }class B extends A { override def print = println("B") }def foo(implicit a: A) = a.printdef bar(implicit a: A) = { implicit val b = new B foo}bar(new A) // B 我想知道为什么在bar中调用foo
请考虑以下代码:

class A { def print = println("A") }
class B extends A { override def print = println("B") }

def foo(implicit a: A) = a.print

def bar(implicit a: A) = {
  implicit val b = new B
  foo
}

bar(new A) // B

我想知道为什么在bar中调用foo不会引起模糊的隐式值错误.当然

implicit val b: A = new B

会引起这个错误.为什么foo选择隐式b而不是隐式a?或者甚至更一般:将采取什么规则?

编辑:
由于我与Ivan的评论 – 我想澄清:如果我以与隐式方法参数相同的方式命名本地隐式val,我会知道我的问题的答案.

def bar(implicit a: A) = {
  implicit val a = new B
  foo
}

然后只有本地val a在范围内 – 覆盖方法参数,因为它们具有相同的名称.

解决方法

注意:我可能大大超过了一些东西,但在测试中它似乎如下.

这是因为第二个在内部范围内,所以它具有优先权.与之相同的事情也是如此

object test {
 val a = 5
 def test(i: Int) = {
   val a  = 6
   i + a
 }
}

在这种情况下,您可能希望函数内部为6.以下是类似的.

object test {
  implicit val i = 5; 
  { 
    implicit val b = 6; 
    test
  } 
  def test(implicit ii:Int) = println(ii)
}

从评论更新.

scala> def test(a: Int) = {val a = 5; a }
test: (a: Int)Int

scala> test(6)
res1: Int = 5

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读