Rust中new函数参数与结构体成员变量同名是否合法可正常编译?
问题解答
这段代码无法直接通过编译,但调整参数类型声明后,参数与结构体成员同名的写法是完全允许的,且能按预期运行。
1. 原代码的编译错误
原代码中new函数的参数my_data没有声明类型,Rust是强类型语言,要求所有函数参数必须显式标注类型,这是第一个需要修正的点。
2. 修正后的合法代码
添加参数类型后,参数与成员同名的写法完全合法,Rust能明确区分结构体字段和函数参数:
struct MyType { my_data: i32, } impl MyType { pub fn new(my_data: i32) -> Self { Self { my_data: my_data, // 左边是结构体字段,右边是函数参数,无歧义 } } }
3. Rust的简化写法
针对字段与参数同名的场景,Rust提供了语法糖,可以直接省略冒号和重复的变量名,写法更简洁:
pub fn new(my_data: i32) -> Self { Self { my_data } // 等价于完整写法 }
4. 与C++的对比
和C不同,Rust在结构体初始化的场景下不会出现歧义——冒号左侧固定是结构体的字段名,右侧是当前作用域的变量,不需要类似this->的语法来区分。如果在其他方法中需要区分同名的字段和局部变量,可以通过self.my_data来指代结构体字段(类似C的this->my_data),但Rust的self需要作为方法参数显式声明,而非隐含存在。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

