我是朱莉娅的新手,所以这可能是微不足道的.
我在一个看起来像的模块中有一个函数定义(使用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.
谢谢,
金
看起来您可能对方法扩展和函数遮蔽之间的细微差别感到困惑。
\n\n这是它的缺点。当您编写 时,Julia只function add!(::Graph, ...); \xe2\x80\xa6; end;查看您的本地范围并查看是否已定义。如果是,那么它将使用这个新的方法签名来扩展该功能。但如果它尚未在本地定义,那么 Julia 会为该函数创建一个新的本地变量。add!add!
正如 JMW 的评论所暗示的那样,我敢打赌你有两个独立的add!功能。Base.add!和RDF.add!。在您的 RDF 模块中,您正在隐藏Base.add!. 这类似于如何命名局部变量而不影响其他作用域中的pi = 3实变量。Base.pi但在这种情况下,您希望将方法与Base.add!函数合并,并让多个分派负责解决问题。
有两种方法可以获取方法扩展行为:
\n\n在你的module RDF范围内,说import Base: add!。这明确地将Base.add!as 引入您的本地范围add!,从而允许方法扩展。
将您的方法明确定义为function Base.add!(graph::Graph, \xe2\x80\xa6). Base我喜欢这种形式,因为它更明确地记录了您在定义站点扩展功能的意图。
这肯定可以得到更好的记录。模块部分对此有一个简短的引用,并且当前有一个拉取请求应该很快合并,这将有所帮助。
\n| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |