2014-07-25 2 views
6

Ich bin neu bei Julia, also könnte das trivial sein.Funktionssignatur nicht gefunden trotz Darstellung mit Methoden (...)

Ich habe eine Funktionsdefinition innerhalb eines Moduls, das wie (mit UriParser) aussieht:

function add!(graph::Graph, 
       subject::URI, 
       predicate::URI, 
       object::URI) 
    ... 
end 

Außerhalb des Moduls, rufe ich:

add!(g, URIParser.URI("http://test.org/1"), URIParser.URI("http://test.org/2"), URIParser.URI("http://test.org/1")) 

Welche mir diesen Fehler gibt:

ERROR: no method add!(Graph,URI,URI,URI) 
in include at boot.jl:238 
in include_from_node1 at loading.jl:114 
at /Users/jbaran/src/RDF/src/RDF.jl:79 

Seltsam. Denn wenn ich eine passende Signatur sehen:

julia> methods(RDF.add!) 
# 4 methods for generic function "add!": 
add!(graph::Graph,subject::URI,predicate::URI,object::Number) at /Users/jbaran/src/RDF/src/RDF.jl:29 
add!(graph::Graph,subject::URI,predicate::URI,object::String) at /Users/jbaran/src/RDF/src/RDF.jl:36 
add!(graph::Graph,subject::URI,predicate::URI,object::URI) at /Users/jbaran/src/RDF/src/RDF.jl:43 
add!(graph::Graph,statement::Statement) at /Users/jbaran/src/RDF/src/RDF.jl:68 

Zuerst dachte ich, es ist meine Verwendung des Gegenstandes :: war Union (...), aber auch wenn ich definiere drei Funktionen mit Nummer, String und URI, Ich bekomme diesen Fehler.

Gibt es etwas offensichtlich, dass ich vermisse? Ich benutze übrigens Julia 0.2.1 x86_64-apple-darwin12.5.0.

Danke,

Kim

+0

Was passiert, wenn Sie 'RDF.add! '(G, URIParser.URI (" http://test.org/1 "), URIParser.URI (" http://test.org/2 ") URIParser.URI ("http://test.org/1")) '? –

+0

Auch funktioniert, aber letztlich ging für die Umsetzung in der angenommenen Antwort. – Joachim

Antwort

4

Das sieht aus wie Sie etwas von dem sehr kleinen Unterschied zwischen Verfahren erhalten werden können, Erweiterung und Funktion Shadowing.

Hier ist das kurze davon. Wenn Sie function add!(::Graph, ...); …; end; schreiben, schaut Julia nur Ihren lokalen Bereich und sieht, ob add! definiert ist. Wenn dies der Fall ist, wird diese Funktion um diese neue Methodensignatur erweitert. Wenn es nicht bereits lokal definiert ist, erstellt Julia eine neue lokale Variable add! für diese Funktion.

Wie JMW's Kommentar suggeriert, wette ich, dass Sie zwei unabhängige add! Funktionen haben. Base.add! und RDF.add!. In Ihrem RDF-Modul spiegeln Sie die Definition von Base.add!. Dies ist ähnlich wie Sie eine lokale Variable pi = 3 benennen können, ohne die reale Base.pi in anderen Bereichen zu beeinflussen. In diesem Fall möchten Sie jedoch Ihre Methoden mit der Funktion Base.add! zusammenführen und die Auflösung durch mehrere Dispatchs übernehmen lassen.

Es gibt zwei Möglichkeiten, um die Methode Dehnungsverhalten zu bekommen:

  1. Innerhalb Ihres module RDF Umfang, sagen import Base: add!. Dies bringt Base.add! explizit in Ihren lokalen Geltungsbereich als add!, wodurch die Methodenerweiterung ermöglicht wird.

  2. Definieren Sie Ihre Methoden explizit als function Base.add!(graph::Graph, …). Ich mag dieses Formular, da es expliziter Ihre Absichten dokumentiert, die Base Funktion an der Definitionsstelle zu erweitern.

Dies könnte definitiv besser dokumentiert werden. Es gibt einen kurzen Hinweis darauf in der Modules Abschnitt, und es gibt derzeit a pull request, die bald zusammengeführt werden soll, die helfen wird.

+0

Super! Vielen Dank! Ich ging zu Ihrem zweiten Vorschlag, las auch über den Umfang nach und alles funktioniert jetzt gut! – Joachim