gpt4 book ai didi

julia - 尽管使用方法(...)显示,但未找到函数签名

转载 作者:行者123 更新时间:2023-12-04 15:22:25 24 4
gpt4 key购买 nike

我是 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。

谢谢,

最佳答案

看起来您可能会被方法 之间的细微差别所困扰。分机 和功能 阴影 .

这是它的短处。当你写 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应该尽快合并这将有所帮助。

    关于julia - 尽管使用方法(...)显示,但未找到函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24948941/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com