2016-02-05 2 views
0

Здесь я пытаюсь вызвать функцию с использованием implicit. Для того, чтобы попытаться удалить столько котла код пластины как можно функция ссылающееся с помощью:Метод Scala не вызывается

("a" and "j", { 
    println("Hello"); 
}) 

Но это не вызывает f1

как вызвать функцию f1 с вызовом

("a" and "j", { 
    println("Hello"); 
}) 

?

Полный код:

object First extends App { 

     case class Commands(val list: List[String]) { 
     def and(that: String) = Commands(that :: list) 
     } 
     implicit def l(cmd: String) = Commands(cmd :: Nil) 

     implicit def f1(implicit d: (Commands,() => Unit)): Unit = { 
     val launchCommand = d._1.list.reverse.mkString("") + "::" 
     println(launchCommand) 

     println("This method is not being invoked"); 
     d._2() 
     } 

     ("a" and "j", { 
     println("Hello"); 
     }) 

    } 

Update:

object First extends App { 

    case class Commands(val list: List[String]) { 
    def and(that: String) = Commands(that :: list) 
    } 
    implicit def l(cmd: String) = Commands(cmd :: Nil) 

    implicit def f1(implicit d: (Commands,() => Unit)): Unit = { 
    val launchCommand = d._1.list.reverse.mkString("") + "::" 
    println(launchCommand) 

    println("This method is not being invoked"); 
    d._2() 
    } 

    implicit val commandAndFunc = ("a" and "j", { 
    println("Hello"); 
    }) 

    f1 
} 

f1 причины ошибки компилятора:

Multiple markers at this line: 
◾not enough arguments for method f1: (implicit d: (First.Commands,() ⇒ Unit))Unit. Unspecified value parameter d. 
◾could not find implicit value for parameter d: (First.Commands,() ⇒ Unit) 
+0

ли он теперь работать? –

ответ

2
implicit val commandAndFunc: (Commands,() => Unit) = ("a" and "j", {() => 
    println("Hello") 
    }) 

f1 

это будет вызывать f1 с commandAndFunc.
Вы просто определяете кортеж команды и функции. Зачем ему звонить f1?
Как должен компилятор/программа знать, если это вызов f1 или просто объявление кортежа типа Tuple2[Command,() => Unit]?
С неявным вы можете передать параметры без их явного выражения или вы можете преобразовать объект неявным. Вы не можете заставить компилятор узнать магию, что вы хотите назвать.

+0

см. Обновление, ваш код не компилируется? –

+0

Отредактировано: тип 'commandAndFunc' был неправильным, просто скопировал ваш код –

0

Другой вариант:

case class Commands(val list: List[String]) { 
    def and(that: String) = Commands(that :: list) 
    } 

    implicit def l(cmd: String) = Commands(cmd :: Nil) 

    implicit class f1(d: (Commands,() => Unit)) { 

    def exec(): Unit = { 
     val launchCommand = d._1.list.reverse.mkString("") + "::" 
     println(launchCommand) 

     println("This method is not being invoked"); 
     d._2() 
    } 
    } 

    val b = ("a" and "j",() => println("Hello")) 

    b.exec()