2015-08-14 3 views
2

я определил следующий класс как scala.Predef.Ensuring:Curried вызов метода по инфиксной записи

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

implicit class Doing[A](val self: A) extends AnyVal { 
    def doing(body: => Unit): A = { body; self } 
    def doWhen(pred: A => Boolean)(body: => Unit): A = 
    doing{ if (pred(self)) body } 
} 

// Exiting paste mode, now interpreting. 

defined class Doing 

но doWhen метод не работает с инфиксной нотации.

scala> "abc" doWhen(_ == "abc") { println("do") } 
<console>:13: error: missing parameter type for expanded function ((x$1) => x$1.$eq$eq("abc")) 
     "abc" doWhen(_ == "abc") { println("do") } 
        ^

scala> "abc".doWhen(_ == "abc") { println("do") } 
do 
res1: String = abc 

Как использовать doWhen по инфиксному стилю?

ответ

0

Если я правильно понимаю соответствующий раздел Scala Reference, это просто не допускается: правая часть операции инфикса может быть выражением или несколькими выражениями в круглых скобках, вы не можете иметь несколько списков аргументов.

0

Вы не можете иметь несколько списков аргументов в правой части операции инфикса. Таким образом, чтобы выполнить то, что вы пытаетесь сделать, вам необходимо либо использовать не-кэрри метод:

implicit class Doing[A](val self: A) extends AnyVal { 
    def doing(body: => Unit): A = { body; self } 
    def doWhen(pred: A => Boolean, body: => Unit): A = 
    doing{ if (pred(self)) body } 
} 

или явно применить второй аргумент функции, созданной первым аргументом, используя некоторые круглые скобки:

("abc" doWhen(_ == "abc")) { println("do") } 
Смежные вопросы