我是朱莉娅的新手,所以这可能是微不足道的。
我在模块中有一个看起来像(使用URIParser)的函数定义:
function add!(graph::Graph,
subject::URI,
predicate::URI,
object::URI)
...
end
在模块之外,我打电话给:
add!(g, URIParser.URI("http://test.org/1"), URIParser.URI("http://test.org/2"), URIParser.URI("http://test.org/1"))
这给了我这个错误:
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
怪异。因为当我能看到匹配的签名时:
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
起初我认为这是我对object :: Union(...)的使用,但即使我用Number,String和URI定义了三个函数,我也会收到此错误。
有什么明显的东西让我失踪吗?顺便说一下,我正在使用Julia 0.2.1 x86_64-apple-darwin12.5.0。
谢谢,
金
答案 0 :(得分:4)
看起来您可能会对方法扩展和功能阴影之间的微小差异感到不满。
这里缺少它。当您编写function add!(::Graph, ...); …; end;
时,Julia会查看 您的本地范围,并查看是否已定义add!
。如果是,则它将使用此新方法签名扩展该函数。但如果它尚未在本地定义,那么Julia会为该函数创建一个新的局部变量add!
。
正如JMW的评论所暗示的那样,我敢打赌你有两个独立的add!
函数。 Base.add!
和RDF.add!
。在您的RDF模块中,您隐藏了Base.add!
的定义。这类似于如何命名局部变量pi = 3
而不影响其他范围中的真实Base.pi
。但在这种情况下,您希望将方法与Base.add!
函数合并,让多个调度处理分辨率。
有两种方法可以获得方法扩展行为:
在module RDF
范围内,请说import Base: add!
。这会将Base.add!
明确地带到您的本地范围add!
,允许方法扩展。
将您的方法明确定义为function Base.add!(graph::Graph, …)
。我喜欢这种形式,因为它更明确地记录了你在定义网站上扩展Base
函数的意图。
这绝对可以更好地记录下来。在Modules部分中对此进行了简短的引用,目前a pull request应尽快合并,这将有所帮助。