2016-04-07 11 views
0

Versuchen, Darlehen Muster mit Typ Parameter zu verlängern und den nächsten Fehler bekommen. Sieht aus wie nur ein Syntaxfehler. Ich vermute, dass dies eine Curry-Beschränkung ist? und Rückgabetyp muss irgendwie in meinem Fall zur Verfügung gestellt werden. Danke!scala # erweitern Darlehen Muster mit Typ Parameter: Problem

 import java.io._ 

    //def withPrintWriter(file: File)(op: PrintWriter => Unit) {  
    def withPrintWriter[T: Numeric](file: File)(implicit count: Numeric[T])(op: PrintWriter => Unit) {   
    import count._ 
    val writer = new PrintWriter(file)  
    try {   
     for(x <- 0 to count.toInt()) 
     {       
      op(writer) 
     } 
    } finally { 
     writer.close() 
    } 
} 


val file = new File("date.txt") 

withPrintWriter[Int](file)(5){ 
//withPrintWriter(file){ 
    writer => writer.println(new java.util.Date) 
} 

Fehler: c: \ Sources \ scala \ main.scala: 101: Fehler:. '=' Erwartet, aber '(' gefunden def withPrintWriter [T: Ziffern] (Datei: File) (implizite Anzahl: Numerisch [T]) ( op: PrintWriter => Einheit) { ^ c: \ Quellen \ scala \ main.scala: 115: Fehler: illegaler Start des einfachen Ausdrucks val file = neue Datei ("date. txt ") ^

+1

Die Parameterliste mit 'implizit' muss die letzte sein, und mit' T: Numerisch' wird der implizite Parameter nicht benötigt. Entweder 'def withPrintWriter [T] (Datei: Datei) (op: PrintWriter => Unit) (implizite Zählung: Numerisch [T]): Einheit' oder 'def mitDruckersteller [T: Numerisch] (Datei: Datei) (op: PrintWriter => Unit): Unit '(mit' val count = implizit [Numeric [T]] 'im fun body. – cchantep

+0

Danke für den Tipp. Ich habe Probleme mit der Funktionssignatur gelöst: withPrintWriter [T: Numeric] (Datei : Datei) (op: PrintWriter => Unit) (implizite Anzahl: T): Unit, aber beim Aufruf dieser Funktion tritt ein Problem auf: \t val file = neue Datei ("date.txt") \t val count: Int = 5 \t withPrintWriter [Int] (Datei) (writer => writer.println (new java.util.Date)) (Anzahl) Fehler: Nicht genug Argumente zur Verfügung gestellt! :( – Pavel

+0

'implizite Anzahl: T' wie kein Sinn gibt – cchantep

Antwort

0

Sieht so aus als hätte ich die Antwort als Antwort auf meine Frage :) implizit war nicht erforderlich, um im Originalcode zu verwenden! Sieht einfach aus ...

+1

Die 'asInstanceOf [T]' ist unsicher und macht die Ansicht '' Numeric' 'unbrauchbar. Besser geht 'val limit = implizit [Numeric [T]]. ToInt (count); (0 zu begrenzen) .foreach {_ => op (writer)} ' – cchantep

+0

Danke für den Tipp, ich wusste nicht, was dieser unsichere könnte führen? Ich würde vermuten, dass eine Typumwandlung nicht möglich ist? – Pavel

+0

'isInstanceOf' ist in sich unsicher – cchantep

0

Von nur einem kurzen Blick, es sieht aus wie Ihre Methode def ist ein = vor dem Körper fehlt (bracke ts) ... zB def foo(a: Int): Int = { ... }

+0

Nun, anscheinend = ich s nicht erforderlich, wie ich sehen kann. Die nächste Funktionssignatur funktioniert einwandfrei: def withPrintWriter [T: Numerisch] (Datei: Datei) (op: PrintWriter => Unit) (Anzahl: T) { – Pavel

+0

'=' wird nicht benötigt, da 'def foo() {' automatisch den Rückgabetyp zu 'Unit' (ist das gleiche wie' def foo(): Unit = {') – cchantep

+0

Richtig, mein Schlechter ... Ich habe nicht auf die Tatsache geachtet, dass diese Einheit zurückgegeben wurde; Ich entschuldige mich, wenn das irreführend war! –