2017-07-27 4 views
2
@tailrec 
    private def loop[V](key: String): V = { 
    key match { 
     case _ => loop(key) 
    } 
    } 

Diese Methode kompiliert nicht und beschwert sich, dass sie einen rekursiven Aufruf enthält, der sich nicht in der Endposition befindet. Kann mir jemand erklären, was vor sich geht? Diese Fehlermeldung macht für mich keinen Sinn.@tailrec Warum kompiliert diese Methode nicht mit 'Enthält einen rekursiven Aufruf nicht in Endposition'?

+1

Muster mit nur einem 'Fall passende _' keinen Sinn macht – cchantep

+0

@cchantep es eine Minimierung ist. –

+0

@cchanstep nur um das Problem zu demonstrieren. Diese Methode macht offensichtlich keinen Sinn – user1861088

Antwort

10

Es kompiliert ok, wenn der generische Typ angegeben wird:

import scala.annotation.tailrec 

@tailrec 
    private def loop[V](key: String): V = { 
    key match { 
     case _ => loop[V](key) 
    } 
    } 

denke ich die Fehlermeldung in diesem Fall ist irreführend.

Eine vereinfachte Version gibt einen besseren Hinweis auf das, was vor sich geht:

scala> @tailrec 
    | private def loop[V](key: String): V = { 
    |  loop(key) 
    | } 
<console>:14: error: could not optimize @tailrec annotated method loop: it is called recursively with different type arguments 
      loop(key) 
     ^
+2

Sie bekommen etwas Hilfe mit '-Ydebug -Ylog: tailcalls'. Es scheint den letzten Fehler zu halten. Vielleicht ist es durch algo für Musterübereinstimmung verwirrt, es gibt einen Code-Kommentar, der besagt, dass es aus diesem Grund vor dem Typer ausgeführt wurde. –

+3

https://github.com/scala/bug/issues/10435 –

+0

Vielen Dank! Deshalb finde ich den Fehler irreführend. Irgendwie fügt das Hinzufügen des Mustervergleichs den Fehler unter dem Fehler – user1861088

Verwandte Themen