调用函数时是否需显式传入self参数?Rust编译报错解析
Rust中构造函数
new要求传入self的问题解决 你遇到的问题根源是错误地给构造函数new添加了self参数,导致它从「关联函数」变成了「实例方法」。
错误原因分析
在Rust中:
- 不带
self的函数是关联函数,属于类型本身,调用方式是Type::function(),不需要先有实例(这也是构造函数new的常规写法)。 - 带
self(包括&self、&mut self)的函数是实例方法,必须通过已有的实例调用,比如instance.method(),调用时Rust会自动把实例作为self参数传递——这也是你之前见过「省略self调用」的场景:调用时自动传参,不是定义时可以随意添加。
你的代码里,fn new(self)-> St把new定义成了实例方法,所以编译器要求你传入一个St实例作为self参数,但这完全违背了构造函数的初衷(构造函数是用来创建实例的,不是用实例来创建实例)。
修复方案
把new函数的self参数去掉,改成关联函数即可:
struct St{ a:i32, } impl St{ // 去掉self参数,作为关联函数 fn new() -> St{ St{a:5} } } fn main() { let st1 = St::new(); // 正常调用,不需要传参 println!("st1.a is {}", st1.a); }
额外说明
如果你确实需要一个带self的方法(比如基于现有实例创建新实例),那调用时必须通过实例触发:
impl St{ // 实例方法:基于当前实例创建新实例 fn clone_new(self) -> St{ St{a: self.a + 1} } } fn main() { let st1 = St{a:5}; let st2 = st1.clone_new(); // 自动把st1作为self传递,不需要显式传参 }
内容的提问来源于stack exchange,提问作者randomranger409
相关产品推荐
相关产品推荐

