2013-06-25 21 views
5

假設我們有對象認爲需要的功能apply方法的參數:如何做兩個函數的參數爲​​隱式

object Wrapper { 
    def apply(block: TypeA => String) = { 
    TypeA a = ... 
    block(a) 
    } 
} 

TypeA是應用程序域類型。

現在,當我定義內嵌塊我可以定義TypeA參數隱式:

Wrapper { implicit a => functionThatUseImplicitA() } 

但如果block參數不是Function1,但Function2?我如何將兩個參數定義爲隱式?

object Wrapper2 { 
    def apply(block: (TypeA, TypeB) => String) = { 
    TypeA a = ... 
    TypeB b = ... 
    block(a, b) 
    } 
} 

這一個不工作:

Wrapper { implicit (a, b) => functionThatUseImplicitAB() } 

唯一的解決方法是將它們定義爲丘壑:

Wrapper { (a, b) => 
    implicit val ia = a 
    implicit val ib = b 
    functionThatUseImplicitAB() 
} 

謝謝!

回答

8

按照SLS6.23 匿名函數implicit關鍵字條款只適用於單一參數功能:

Expr ::= (Bindings | [‘ implicit ’] id | ‘_’) ‘=>’ Expr 
ResultExpr ::= (Bindings | ([‘ implicit ’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block 

所以你不能做兩個函數的參數爲​​隱式。

這是原因之一,用咖喱功能:

object Wrapper { 
    def apply(block: TypeA => TypeB => String) = ??? 
} 

Wrapper { implicit a => implicit b => 
    functionThatUseImplicitAB() 
} 
+0

你能告訴我怎麼解決咖喱功能這個問題? functionThatUseImplicit *來自外部API – 1esha

+0

@AlexeyRomantchouk:我已經更新了我的答案。當你可以改變'Wrapper'的定義時,它解決了你的問題。 – senia

+0

謝謝!這正是我所尋找的 – 1esha

相關問題