gpt4 book ai didi

scala - Scala 中隐式参数的两种不同用途?

转载 作者:行者123 更新时间:2023-12-04 18:19:14 26 4
gpt4 key购买 nike

(我对 Scala 相当陌生,希望这不是一个愚蠢的问题。)

从我所见,声明一个函数的参数 implicit两个 (相关,但完全不同)用途:

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

  • 在代码中:
    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

    这似乎有些奇怪,不是吗?删除 implicit从第 1 行开始,两个调用(从其他地方到 someFunction,从 someOtherFunctionsomeFunction)都不会编译。

    这背后的原理是什么? ( 编辑: 我的意思是官方理由是什么,以防万一可以在某些官方 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
    }
    }

    关于scala - Scala 中隐式参数的两种不同用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53931407/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com