【问题标题】:UndefVarError: * not definedUndefVarError: * 未定义
【发布时间】:2021-06-17 02:47:39
【问题描述】:

我遇到一个持续错误,当我在正在处理的包中使用乘法时,Julia 告诉我乘法运算符未定义。在包中,我没有重新定义或扩展基本乘法运算符,并且在某些地方可以识别乘法,而在其他地方则不能。比如下面的代码中

    Λ = h.metric.Λ # Type Int64
    kSize = 2*Λ+1
    for i = 1:n_steps
        # Tempering
        r = temper(lf, r, (i=i, is_half=true), n_steps)
        # Take a half leapfrog step for momentum variable
        r = r - map(gradi -> ϵ / 2 .* gradi, grad)

第 2 行的乘法给了我UndefVarError: * not defined,而最后一行的乘法编译并执行没有错误。

包外和 Visual Studio Code 上的 Julia REPL 中的乘法似乎没有相同的错误。

我在主模块和文件中的单个 Julia 包中都尝试了 Using Base: *import Base.*,但均无济于事。对可能发生的事情有任何想法吗?

【问题讨论】:

    标签: julia


    【解决方案1】:

    如果您稍后在函数中或在未被采用的分支中不小心分配*,则会出现此信息。一个容易发生这种情况的地方是if 表达式,它打算询问是否a*b == c,但错误地使用= 而不是==

    julia> function test(a, b, c)
               d = a*b
               if (a*b = c)
                   println("got $d")
               end
           end
    test (generic function with 1 method)
    
    julia> test(2,3,6)
    ERROR: UndefVarError: * not defined
    Stacktrace:
     [1] test(a::Int64, b::Int64, c::Int64)
       @ Main ./REPL[4]:2
     [2] top-level scope
       @ REPL[5]:1
    

    【讨论】:

    • 直到您可以在 Julia 中使用 a*b = 定义运算符,而不需要更冗长但更安全的 Base.:(*)(a,b) =。看起来很危险。
    • 查看问题#15483#17730
    【解决方案2】:

    如果没有可重现的示例和完整的错误消息,很难提供帮助。我能想到的唯一未定义* 的上下文是baremodule

    julia> *
    * (generic function with 328 methods)
    
    julia> module M1
           *
           end
    Main.M1
    
    julia> baremodule M2
           *
           end
    ERROR: UndefVarError: * not defined
    Stacktrace:
     [1] top-level scope
       @ REPL[2]:2
    

    【讨论】:

    • 是的,不幸的是,这个错误很难重现,而且错误消息的内容并不比UndefVarError 多。我没有在包中的哪个位置使用baremodule 而不是module。感谢您的帮助。
    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多