斯卡拉:通过隐含参数的函数会返回另一个功能
问题描述:
比方说,我有四节课斯卡拉:通过隐含参数的函数会返回另一个功能
class I
class A
class B
class C
和功能需要两个参数,其中一个是隐含的,并返回另一个功能:
def f(arg: String)(implicit i: I): (C => B) => A = _ => new A
我在范围内隐I
地方:
implicit val i = new I
所以,我娃NT调用f
这样:
f("123") { c => new B }
但我对拉姆达PARAM 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 }
这给了我们所需要的,但代码看起来繁琐。我想调用更简单的函数。
那么,如何在一行中调用这样的函数呢?
答
另一种选择是明确写入apply
。
f("123") apply { c => new B }
f("123").apply(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
希望这有助于。