Julia中where关键字的作用及内部构造函数需加where {T}的原因
Julia泛型结构体
where关键字问题解答 1. where关键字的具体含义
where是Julia中专门用于泛型定义场景的关键字,作用是声明类型参数的作用域、以及可选的类型边界约束,可以理解为「对于所有满足后续条件的类型」的声明:
- 写在方法/构造函数签名末尾时,代表当前定义是泛型实现,签名中出现的对应大写字母是可变的类型参数,而非固定具体类型
- 可以跟上界约束限定类型参数的范围,比如
where T<:myType就代表T必须是myType的子类型,无额外约束时可简写为where {T}
2. 示例代码中内部构造函数必须加where {T}的原因
你定义的是参数化泛型结构体A{T<:myType},外层结构体声明的类型参数T的作用域不会自动渗透到内部构造函数的独立作用域中。
你显式写了构造函数签名A{T}(arg,arg1),如果没有末尾的where {T}声明,Julia会默认将签名中的T识别为全局作用域中已经定义的具体类型,而非泛型参数。只有添加where {T}后,Julia才会将这个T识别为当前构造函数的泛型参数,自动和外层结构体的类型参数T绑定,你才能在构造函数内部调用new{T}完成实例化。
补充说明:如果没有自定义内部构造函数,Julia会自动生成带有正确
where声明的默认泛型构造函数,无需手动编写;只有当你显式覆盖内部构造函数、且签名中用到了结构体的泛型参数时,才需要手动加where声明。
3. 省略where {T}后报「T is not defined」的根本原因
这是Julia的作用域规则决定的:泛型结构体的外层类型参数,和内部构造函数的作用域是隔离的。
省略where {T}时,构造函数签名里的T没有被声明为当前构造函数的类型参数,Julia会按作用域链从内到外查找已经定义的、名为T的类型/常量,找不到对应定义就会抛出「T未定义」的错误。
内容的提问来源于stack exchange,提问作者ahm5
相关产品推荐
相关产品推荐

