无法在另一个模块M2

时间:2015-12-19 15:01:03

标签: module scope julia

我目前正在学习这种伟大的朱莉娅语,但我面临一个困难,我最好的朋友谷歌似乎没有回答(也许我的搜索能力很差)。

无论如何......我的背景如下:

我有两个模块:

  1. M1.jl

    module M1
    type T
        t1::Int64
    end
    
    T() = T(0)
    
    export T
    end
    
  2. M2.jl

    module M2
    function create()
         isdefined(:T) ? T() : "undef"
    end
    
    export create
    end
    
  3. 如果定义了类型,我只想调用create函数来实例化T类型的对象。这是我尝试做的事情(路径中假设模块M1M2):

    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)

    所以我的问题是:

    1. 是否可以使功能create"参见"在当前会话中加载的模块中定义的类型?
    2. 您能否解释一下我收到此错误ERROR: UndefVarError: T not defined,因为如果我的上下文中未定义T,则isdefined必须已返回false "undef"本应该被退回?
    3. 非常感谢提前。

      问候。

1 个答案:

答案 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)