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

Joa*_*him 6 julia

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

我在一个看起来像的模块中有一个函数定义(使用URIParser):

function add!(graph::Graph,
              subject::URI,
              predicate::URI,
              object::URI)
    ...
end
Run Code Online (Sandbox Code Playgroud)

在模块之外,我打电话给:

add!(g, URIParser.URI("http://test.org/1"), URIParser.URI("http://test.org/2"), URIParser.URI("http://test.org/1"))
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

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
Run Code Online (Sandbox Code Playgroud)

奇怪的.因为当我能看到匹配的签名时:

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
Run Code Online (Sandbox Code Playgroud)

起初我以为这是我对object :: Union(...)的使用,但即使我用Number,String和URI定义了三个函数,我也会遇到这个错误.

有什么明显的东西让我失踪吗?顺便说一下,我正在使用Julia 0.2.1 x86_64-apple-darwin12.5.0.

谢谢,

Mat*_* B. 4

看起来您可能对方法扩展和函数遮蔽之间的细微差别感到困惑。

\n\n

这是它的缺点。当您编写 时,Juliafunction add!(::Graph, ...); \xe2\x80\xa6; end;查看您的本地范围并查看是否已定义。如果是,那么它将使用这个新的方法签名来扩展该功能。但如果它尚未在本地定义,那么 Julia 会为该函数创建一个新的本地变量。add!add!

\n\n

正如 JMW 的评论所暗示的那样,我敢打赌你有两个独立的add!功能。Base.add!RDF.add!。在您的 RDF 模块中,您正在隐藏Base.add!. 这类似于如何命名局部变量而不影响其他作用域中的pi = 3实变量。Base.pi但在这种情况下,您希望将方法与Base.add!函数合并,并让多个分派负责解决问题。

\n\n

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

\n\n
    \n
  1. 在你的module RDF范围内,说import Base: add!。这明确地将Base.add!as 引入您的本地范围add!,从而允许方法扩展。

  2. \n
  3. 将您的方法明确定义为function Base.add!(graph::Graph, \xe2\x80\xa6). Base我喜欢这种形式,因为它更明确地记录了您在定义站点扩展功能的意图。

  4. \n
\n\n

这肯定可以得到更好的记录。模块部分对此有一个简短的引用,并且当前有一个拉取请求应该很快合并,这将有所帮助。

\n