编程Rust 开发者 / 后端开发者

在 Rust 中,构造函数和工厂方法是什么(例如,new,with_capacity),如何正确实现它们,以及初学者常见的错误是什么?

用 Hintsage AI 助手通过面试

回答。

Rust 没有类似于 C++/Java 的特殊构造函数。通常,构造函数实现为 关联函数(例如,new)。重要特点:

  • 关联函数与特征或对象不相关,通过 :: 调用。
  • 它可以返回 self,也可以返回 Result<Self, E>——方便用于可失败的构造函数。
  • 可以实现不同的工厂(with_capacityfrom_str,自定义变体)。

基本构造函数示例:

struct Point { x: i32, y: i32 } impl Point { pub fn new(x: i32, y: i32) -> Self { Point { x, y } } }

可失败构造函数示例:

impl Point { pub fn try_new(x: i32, y: i32) -> Result<Self, String> { if x < 0 || y < 0 { Err("坐标必须为非负数".to_string()) } else { Ok(Point { x, y }) } } }

陷阱问题。

构造函数应该使用什么类型的函数:普通函数、方法还是关联函数,为什么?

许多人回答:“方法”。但在 Rust 中,构造函数仅为 关联函数(没有 self),因为实例还不存在,无法调用普通方法。

struct Foo; impl Foo { // 关联函数,不是方法 pub fn new() -> Self { Foo } }

由于对主题细节不了解而导致的实际错误示例。


故事

程序员将构造函数实现为方法:

impl Point { pub fn make(&self, x: i32, y: i32) -> Self { ... } }

这不合逻辑且令人困惑:创建对象需要一个尚不存在的对象!开发者不知如何调用这个方法。修正为静态函数。


故事

经典错误:对可失败的构造函数返回 Option<Self> 而不发出警告,导致错过级联错误。在返回 Result<Self, E> 后,可以更明确地输出错误。


故事

实现 from_partsfrom_str 这种工厂而不使用 trait 的 From/FromStr。结果标准转换机制失效(例如,str.parse::<MyType>())。在发现错误后引入了 FromStr,提高了代码与生态系统库的兼容性。