2016-03-05 62 views
2

假设我有一个Julia模块MyModule,它定义了一维卷积函数conv()。我希望能够通过MyModule.conv()在导入或使用该文件的文件中调用此函数。例如:使用模块功能代替基本功能Julia

import MyModule.conv 
MyModule.conv() 

但是,我无法获得此语法的工作; Julia仍然拨打Base.conv()而不是MyModule.conv()。我尝试了所有不同风格的usingimport,但无法使此语法起作用。

这个功能在Julia中可用吗?我觉得我已经看到这在其他朱莉娅包实施,但无法找到一个有效的例子。

EDIT

当前设置如下;在定义之外的ModA中没有提到conv()。

module ModA 

function conv(a, b) 
    println("ModA.conv") 
end 

end 

然后,在另一个文件中,

import ModA 
conv(x, y) #still calls Base.conv() 

解决
这完全是我的错。由于LOAD_PATH调用的文件的版本不正确,导致无法正常工作,因为LOAD_PATH调用的文件的版本不是我认为正在调用的版本(查找LOAD_PATH中的第一个,而不是我正在编辑的版本)。完全是我的错......

+1

编辑您的模块。然后在另一个文件(或在REPL)中,输入'使用ModA',然后输入'ModA.conv(randn(2),randn(2))'。那是不是你以后的行为?在ModA中 –

+0

,你应该'导入​​Base.conv'。 – Gnimuc

+0

如果你在'ModA'中导入Base.conv',那么你将会在它上面重载方法,并且只有一个'conv'函数在播放。据我了解,这里的意图是保留两个独立的功能。 –

回答

2

你的意思是这样吗?

module ModA 
    conv() = println("Calling ModA.conv") 
end 

module ModB # Import just conv from ModA 
    using ..ModA.conv # Could have used import ..ModA.conv instead 
    conv()   # if we want to be able to extend ModA.conv 
end 

module ModC # Import ModA and use qualified access to access ModA.conv 
    import ..ModA 
    ModA.conv() 
end 

您必须确保不使内ModAconv任何引用你自己定义函数之前,或将已经抬头Base.convconv与之相关的名称。

+0

这是我试图实现的功能,但它不能按预期工作。它仍然调用'Base.conv()',尽管据我所知,它确实不应该。有关可能导致它继续调用'Base.conv()'的任何进一步建议? –

+0

你上面试过我的示例代码吗?它不适合你吗?它对我来说非常合适(在Julia 0.4上)。请注意有两种组合可以工作。如果你输入ModA,那么你必须使用合格的访问权限(如'ModC')。 –

+0

您的示例代码完全按照预期工作,以及我过去如何使用Julia。我刚刚解决了我的问题;由于LOAD_PATH调用的文件的版本不正确,所以它不起作用,因为它调用的文件的版本不是我认为正在调用的版本(查找LOAD_PATH中的第一个,而不是我正在编辑的版本)。感谢您的帮助! –