Rust 没有类似于 C++/Java 的特殊构造函数。通常,构造函数实现为 关联函数(例如,new)。重要特点:
:: 调用。Result<Self, E>——方便用于可失败的构造函数。with_capacity,from_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_parts,from_str这种工厂而不使用 trait 的 From/FromStr。结果标准转换机制失效(例如,str.parse::<MyType>())。在发现错误后引入了 FromStr,提高了代码与生态系统库的兼容性。