【发布时间】:2019-01-01 06:58:26
【问题描述】:
(我对 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
这似乎有些奇怪,不是吗?从第 1 行删除 implicit 将使两个调用(从其他地方到 someFunction,从 someFunction 内到 someOtherFunction)都无法编译。
这背后的原理是什么? (编辑:我的意思是官方的基本原理是什么,以防可以在一些官方的 Scala 资源中找到。)
有没有一种方法可以实现一个而没有另一个(即允许将参数隐式传递给函数,而不允许在调用其他函数时在该函数中隐式使用它,和/或使用非隐式调用其他函数时隐式参数)? (编辑:我稍微改变了这个问题。另外,为了澄清,我的意思是是否有语言结构允许这样做 - 不通过手动阴影或类似方式实现效果.)
【问题讨论】:
-
我认为第二个澄清的问题已经得到回答,因为需要大量的代码扭曲来演示所请求的转换/限制。
-
“另外,澄清一下,我的意思是是否有语言结构允许这样做”不,没有。