2013-03-13 10 views
25

Ich dokumentiere eine Scala-Klasse mit overloaded methods. Wie kann ich sie unterscheiden, wenn ich sie in scaladoc-Kommentaren anspreche? Zum Beispiel, wenn ichWie können Links zu Methoden in scaladoc disambiguiert werden?

/** 
* The most important method is [[Doc.foo]]. 
*/ 
object Doc { 
    def foo[A]: A = throw new UnsupportedOperationException; 
    def foo[A,B >: A](x: A): B = x; 
} 

und laufe sbt doc ich

Doc.scala: 1: Warnung: Das Link-Ziel "Doc.foo" nicht eindeutig ist. Mehrere (möglicherweise überlastet) Mitglieder passen die Target:

  • Methode foo[A,B>:A](x:A):B in Objekt Doc [ausgewählt]
  • Methode foo[A]:Nothing in Objekt Doc

Verwenden von foo[A,B >: A] usw. auf die Verbindung nicht Arbeit.

+1

Würde '[[Doc.foo()]]' funktionieren? Ich weiß, dass in C#, wenn es eine mehrdeutige Referenz in der Dokumentation gibt, Sie entweder '()' verwenden müssen, wenn Sie die Methode ohne Parameter oder die * Argumenttypen * buchstabieren, z. 'foo (string)'. Vielleicht ist es hier ähnlich ... –

+0

@ Trustme-I'maDoctor Das funktioniert nicht, beschwert sich mit: _warning: Es konnte kein Mitglied für "Doc.foo()" gefunden werden ._ –

+0

ein PR unter https: // github.com/scala/docs.scala-lang das Hinzufügen von Dokumentation dazu http://docs.scala-lang.org/overviews/scaladoc/for-library-authors.html wäre willkommen –

Antwort

20

Die folgenden scheint der Trick in Scala 2.10.

/** 
* The most important method is [[Doc.foo[A]:A*]]. 
*/ 

Und hier ist ein Hinweis scaladoc mir gibt:

[warn] Quick crash course on using Scaladoc links 
[warn] ========================================== 
[warn] Disambiguating terms and types: Prefix terms with '$' and types with '!' in case both names are in use: 
[warn] - [[scala.collection.immutable.List!.apply class List's apply method]] and 
[warn] - [[scala.collection.immutable.List$.apply object List's apply method]] 
[warn] Disambiguating overloaded members: If a term is overloaded, you can indicate the first part of its signature followed by *: 
[warn] - [[[scala.collection.immutable.List$.fill[A](Int)(⇒A):List[A]* Fill with a single parameter]]] 
[warn] - [[[scala.collection.immutable.List$.fill[A](Int,Int)(⇒A):List[List[A]]* Fill with a two parameters]]] 
[warn] Notes: 
[warn] - you can use any number of matching square brackets to avoid interference with the signature 
[warn] - you can use \. to escape dots in prefixes (don't forget to use * at the end to match the signature!) 
[warn] - you can use \# to escape hashes, otherwise they will be considered as delimiters, like dots. 
+9

Ich finde es abscheulich, dass ScalDoc kann Namen werden nicht über Importe aufgelöst. Ich lehne es ab, voll qualifizierte Namen in Dokumentationskommentaren zu verwenden. –

+0

Anscheinend wird der Hinweis nur angezeigt, wenn ich scaladoc direkt benutze.Ich habe sbt benutzt, was es nicht gezeigt hat. –

+0

@Randall Schulz Dies sollte gemäß dieser Ausgabe behoben werden: https://issues.scala-lang.org/browse/SI-3695 – EECOLOR

7

ich eine Lösung gefunden (anscheinend die eindeutige Lösung) für komplexe Signaturen, durch die doc von scaladoc studieren.

  • Do Raum nicht
  • der Signatur verwenden Verwenden Sie die Argumente
  • Für Argumenttypen sowie Rückgabetypen, Präfix alle Punkte mit einem einzigen Backslash \
  • Verwenden Sie den Stern * an den Namen Ende der Signatur
  • Verwenden Sie die vollständige Signatur (da die mehrdeutigen Signaturen Ihnen vorgeschlagen werden). Dieser Schritt ist optional, Sie in der Lage sein können, die Unterschrift früher zu stoppen, solange Sie es mit *

Beispiel beenden:

package org.my.stuff 

class ReturnType 

object Foo { 
    class Bar { 
    def lara(s: String): String = ??? 
    def lara(s: Foo.Bar): ReturnType= ??? 
    } 
} 

/** [[org.my.stuff.Foo$.Bar.lara(s:org\.my\.stuff\.Foo\.Bar):org\.my\.stuff\.ReturnType* The link to the right lara method]] 
    */ 
object DocumentFooBarBingComplex { 
} 
+0

"Verwenden Sie kein Leerzeichen in der Signatur" - Was ist, wenn ein impliziter Parameter vorhanden ist? –

+0

Leider würde das nicht funktionieren. Sie können versuchen, \ vor dem Leerzeichen hinzuzufügen, oder stellen Sie sicher, dass Sie nicht auf die impliziten Parameter schreiben müssen, um Ihren Code zu disambiguieren. –

7

Ich bin immer noch überrascht, wie schwierig es ist, um diese Arbeit und den Mangel an Dokumentation für scaladoc selbst zu bekommen. Ich entschied mich, die Scala-Code-Basis selbst zu suchen, in der Hoffnung auf einige nützliche Beispiele. Die besten, die ich gefunden habe, waren in https://github.com/scala/scala/blob/2.12.x/test/scaladoc/resources/links.scala. Hoffentlich ist das nützlich für jemand anderen, der darauf stößt.

+0

Schließlich kann ich ein Beispiel verwenden. Vielen Dank. –