2017-06-16 70 views
1

比方說,我有四節課斯卡拉:通過隱含參數的函數會返回另一個功能

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 } 

這給了我們所需要的,但代碼看起來繁瑣。我想調用更簡單的函數。

那麼,如何在一行中調用這樣的函數呢?

回答

3

另一種選擇是明確寫入apply

f("123") apply { c => new B } 
f("123").apply(c => new B) 
0

我們可以寫簡單的包裝這樣的功能f

def g(arg: String)(fun: C => B)(implicit i: I) => A = f(arg)(i)(fun) 

現在隱含參數真的是最後一個函數的參數,我們可以調用g在一行是這樣的:

g("123") { c => new B } 
3

我認爲Implicitly適合您的使用情況。

f("123")(implicitly[I])((c: C) => new B)

Implicitly是Scala 2.8可用且Predef被定義爲:

def implicitly[T](implicit e: T): T = e 

希望這有助於。