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

Scala中隐式参数的两种不同用法?

发布时间:2020-12-16 18:13:50 所属栏目:安全 来源:网络整理
导读:(我对 Scala相当新,希望这不是一个愚蠢的问题.) 从我所看到的,将参数声明为隐式函数有两个(相关但非常不同)的用途: 当编译器可以找到要传递的唯一合适值(在调用范围内)时,它会在调用给定函数时显式传递相应的参数. 它使参数本身成为一个合适的值,用于传递给
(我对 Scala相当新,希望这不是一个愚蠢的问题.)

从我所看到的,将参数声明为隐式函数有两个(相关但非常不同)的用途:

>当编译器可以找到要传递的唯一合适值(在调用范围内)时,它会在调用给定函数时显式传递相应的参数.
>它使参数本身成为一个合适的值,用于传递给具有隐式参数的其他函数(当从给定函数中调用它们时).

在代码中:

def someFunction(implicit someParameter: SomeClass) = {  // Note `implicit`
  ...
  // Note no argument supplied in following call;
  // possible thanks to the combination of
  // `implicit` in `someOtherFunction` (1) and
  // `implicit` in line 1 above (2)
  someOtherFunction
  ...
}

def someOtherFunction(implicit someOtherParameter: SomeClass) = {
  ...
}

implicit val someValue = new SomeClass(...)
// Note no argument supplied in following call;
// possible thanks to `implicit` (1)
someFunction

这看起来有些奇怪,不是吗?从第1行中删除隐式将使得两个调用(来自someFunction的someFunction和someFunction中的someOtherFunction)都不能编译.

这背后的理由是什么? (编辑:我的意思是官方的理由是什么,以防任何官方Scala资源中都可以找到.)

是否有一种方法可以实现一个没有另一个(即允许隐式地将参数传递给函数而不允许在调用其他函数时隐式地在该函数中使用它,和/或在隐式地使用非隐式参数时调用其他功能)? (编辑:我稍微改变了一下这个问题.另外,澄清一下,我的意思是说是否有一种语言结构允许这样做 – 没有通过手动阴影或类似方法实现效果.)

解决方法

对于第一个问题

What is the rationale behind this?

答案很可能是基于意见的.

And is there a way to achieve one without the other?

是的,虽然如果你想要实际使用参数,它比我最初想象的要复杂一点:

def someFunction(implicit someParameter: SomeClass) = {
  val _someParameter = someParameter // rename to make it accessible in the inner block

  { 
    val someParameter = 0 // shadow someParameter by a non-implicit
    someOtherFunction // doesn't compile
    someOtherFunction(_someParameter) // passed explicitly
  }
}

(编辑:李大同)

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

    推荐文章
      热点阅读