运行Array{Int64}(undef,0)报UndefVarError的原因及替代方案
错误产生原因
触发UndefVarError: undef not defined的核心原因是你运行代码使用的Julia版本过低:undef是Julia 1.0正式版才加入核心命名空间的内置常量,专门作为数组构造的占位符使用,标记要创建的数组不需要提前填充初始值。在0.7及更早的Julia版本中,这个标识符根本不存在,解释器找不到对应定义自然会抛出该错误。
如果是在1.0以上版本碰到这个错,基本都是你在当前作用域内拿undef当自定义变量名赋值过,覆盖了核心库的默认绑定,这种情况删掉同名自定义变量即可恢复。
可行替代实现方式
你写的代码目标是创建一个存储Int64类型值、长度为0的一维数组,根据自己使用的Julia版本选择以下任意一种写法都可以实现需求:
- 全版本通用首选写法:直接使用类型化空数组字面量
tt = Int64[]。这个写法从早期Julia版本到最新稳定版都能正常运行,语义直白不需要额外记忆构造函数参数规则,日常编码优先选这个写法即可。 - 1.0+版本的标准未初始化构造写法:将Julia升级到1.0及以上的长期支持版本后,你原本写的
tt=Array{Int64}(undef,0)就可以正常运行;如果明确要创建一维数组,写成tt = Vector{Int64}(undef, 0)可读性更好,运行效果完全一致。 - 0.6及更早旧版本兼容写法:老版本Julia构造未初始化数组不需要传入
undef占位符,直接传入维度参数即可,要创建0长度的对应数组写法为tt = Array{Int64}(0)。 - 构造函数简写:直接调用一维数组的无参构造方法
tt = Vector{Int64}(),不需要传入undef和长度参数,默认就会返回对应类型的空数组,所有1.0+版本都支持该写法。
内容的提问来源于stack exchange,提问作者Soma
相关产品推荐
相关产品推荐

