我目前正在学习这种伟大的朱莉娅语,但我面临一个困难,我最好的朋友谷歌似乎没有回答(也许我的搜索能力很差)。
无论如何......我的背景如下:
我有两个模块:
M1.jl
module M1
type T
t1::Int64
end
T() = T(0)
export T
end
M2.jl
module M2
function create()
isdefined(:T) ? T() : "undef"
end
export create
end
如果定义了类型,我只想调用create
函数来实例化T
类型的对象。这是我尝试做的事情(路径中假设模块M1
和M2
):
using M1;
using M2;
create()
然后我得到了这个ERROR: UndefVarError: T not defined
而我希望得到M1.T(0)
,因为解释器中已知T
,或者至少"undef"
if M1
1}}没有加载到我的会话中。
另外,如果我这样做: 使用M1; 使用M2;
isdefined(:T) ? T() : "undef"
然后一切都很好,我得到:M1.T(0)
所以我的问题是:
create
"参见"在当前会话中加载的模块中定义的类型?ERROR: UndefVarError: T not defined
,因为如果我的上下文中未定义T
,则isdefined
必须已返回false
"undef"
本应该被退回?非常感谢提前。
问候。
答案 0 :(得分:0)
Julia Doc描述了isdefined()
的功能如下:
使用单个符号参数,测试是否在 current_module()中定义了具有该名称的全局变量。
但是哪个模块是 current_module()?
要查找上述问题的答案,我已将whatiscurrentmodule()
函数添加到M2
,并将其加载到Main
我得到的是:
julia> module M2
function whatiscurrentmodule()
println("current_module=",current_module())
end
function create(type_name::AbstractString)
isdefined(:T) ? T() : "undef"
end
export create
println("current_module=",current_module())
end;
current_module=M2
julia> M2.whatiscurrentmodule()
current_module=Main # current_module is the caller module
现在很清楚运行时发生了什么:isdefined()
返回true
因为:T
在调用者范围内定义但T()
无法罚款:T
因为它未导入M2
,为了解决此问题,可以强制M2
使用M1
:
julia> module M2
using M1
function create(type_name::AbstractString)
isdefined(:T) ? T() : "undef"
end
export create
end;
julia> using M1
julia> M2.create("")
M1.T(0)
编辑:或者不导入任何内容,只需添加:T
的完整路径
julia> module M2
function create(type_name::AbstractString)
isdefined(:T) ? current_module().T() : "undef"
end
export create
end;
julia> using M1
julia> M2.create("")
M1.T(0)