2013-06-25 4 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

Смежные вопросы