尽管显示方法(...)仍未找到功能签名

时间:2014-07-25 05:56:20

标签: julia

我是朱莉娅的新手,所以这可能是微不足道的。

我在模块中有一个看起来像(使用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。

谢谢,

1 个答案:

答案 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!函数合并,让多个调度处理分辨率。

有两种方法可以获得方法扩展行为:

  1. module RDF范围内,请说import Base: add!。这会将Base.add!明确地带到您的本地范围add!,允许方法扩展。

  2. 将您的方法明确定义为function Base.add!(graph::Graph, …)。我喜欢这种形式,因为它更明确地记录了你在定义网站上扩展Base函数的意图。

  3. 这绝对可以更好地记录下来。在Modules部分中对此进行了简短的引用,目前a pull request应尽快合并,这将有所帮助。