斯卡拉:通过隐含参数的函数会返回另一个功能

问题描述:

比方说,我有四节课斯卡拉:通过隐含参数的函数会返回另一个功能

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 

希望这有助于。