让我们说,我有四个班级
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
所以,我想以这种方式调用f
:
f("123") { c => new B }
但我不能因为lambda param missing parameter type error
上的c
。好的,我们明确地添加这个参数:
f("123") { c: C => new B }
然后我的类型不匹配:第二个f
参数需要为I
,而是C => B
!
我现在看到两个选项,如何解决这个问题。首先是简单地传递参数:
f("123")(i) { c => new B }
但我们始终无法访问隐含值。此外,我们可以将函数调用分为两个表达式:
val g = f("123")
g { c => new B }
这给了我们需要的东西,但代码似乎很麻烦。我想调用函数更简单。
那么,如何在一行中调用这样的函数呢?
答案 0 :(得分:3)
我认为Implicitly
适合您的用例。
f("123")(implicitly[I])((c: C) => new B)
Implicitly
在Scala 2.8中可用,并在Predef
中定义为:
def implicitly[T](implicit e: T): T = e
希望这有帮助。
答案 1 :(得分:3)
另一个选择是明确写apply
。
f("123") apply { c => new B }
f("123").apply( c => new B )
答案 2 :(得分:0)
我们可以为这样的函数f
编写简单的包装器:
def g(arg: String)(fun: C => B)(implicit i: I) => A = f(arg)(i)(fun)
现在隐式参数实际上是最后一个函数参数,我们可以在一行中以这种方式调用g
:
g("123") { c => new B }