Scala:将隐式参数传递给 returns 另一个函数的函数
Scala: pass implicit argument to function which returns another function
比方说,我有四个 类
class I
class A
class B
class C
并且函数有两个参数,其中一个是隐式的,returns另一个函数:
def f(arg: String)(implicit i: I): (C => B) => A = _ => new A
我在范围内的某处隐含了 I
:
implicit val i = new I
所以,我想这样调用 f
:
f("123") { c => new B }
但我不能,因为 lambda 参数 c
上的 missing parameter type error
。好的,让我们明确地添加这个参数:
f("123") { c: C => new B }
然后我有类型不匹配:第二个 f
参数需要是 I
,而是 C => B
!
我现在看到两个选项,如何解决这个问题。首先是简单地显式传递参数:
f("123")(i) { c => new B }
但我们并不总是能够访问隐式值。另外,我们可以将函数调用分为两个表达式:
val g = f("123")
g { c => new B }
这提供了我们所需要的,但代码似乎很繁琐。我想更简单地调用函数。
那么,如何在一行中调用这样的函数呢?
我们可以为这样的函数编写简单的包装器f
:
def g(arg: String)(fun: C => B)(implicit i: I) => A = f(arg)(i)(fun)
现在隐式参数实际上是函数的最后一个参数,我们可以这样在一行中调用g
:
g("123") { c => new B }
我认为 Implicitly
适合您的用例。
f("123")(implicitly[I])((c: C) => new B)
Implicitly
在 Scala 2.8 中可用,在 Predef
中定义为:
def implicitly[T](implicit e: T): T = e
希望这对您有所帮助。
另一种选择是显式写入 apply
。
f("123") apply { c => new B }
f("123").apply( c => new B )
比方说,我有四个 类
class I
class A
class B
class C
并且函数有两个参数,其中一个是隐式的,returns另一个函数:
def f(arg: String)(implicit i: I): (C => B) => A = _ => new A
我在范围内的某处隐含了 I
:
implicit val i = new I
所以,我想这样调用 f
:
f("123") { c => new B }
但我不能,因为 lambda 参数 c
上的 missing parameter type error
。好的,让我们明确地添加这个参数:
f("123") { c: C => new B }
然后我有类型不匹配:第二个 f
参数需要是 I
,而是 C => B
!
我现在看到两个选项,如何解决这个问题。首先是简单地显式传递参数:
f("123")(i) { c => new B }
但我们并不总是能够访问隐式值。另外,我们可以将函数调用分为两个表达式:
val g = f("123")
g { c => new B }
这提供了我们所需要的,但代码似乎很繁琐。我想更简单地调用函数。
那么,如何在一行中调用这样的函数呢?
我们可以为这样的函数编写简单的包装器f
:
def g(arg: String)(fun: C => B)(implicit i: I) => A = f(arg)(i)(fun)
现在隐式参数实际上是函数的最后一个参数,我们可以这样在一行中调用g
:
g("123") { c => new B }
我认为 Implicitly
适合您的用例。
f("123")(implicitly[I])((c: C) => new B)
Implicitly
在 Scala 2.8 中可用,在 Predef
中定义为:
def implicitly[T](implicit e: T): T = e
希望这对您有所帮助。
另一种选择是显式写入 apply
。
f("123") apply { c => new B }
f("123").apply( c => new B )