何时在 Rust 结构中使用字段或方法?

When to use a field or a method in Rust structs?

我对 Rust 和一般编程还很陌生,我有一个很容易回答的基本问题。假设我有一个矩形对象,它有一个宽度和一个高度,如下所示:

struct Rectangle1 {
    width: u32,
    height: u32,
}

我可以用新方法创建这样一个对象:

fn new(width: u32, height: u32) -> Self {
    Rectangle1 { 
        width, 
        height,
    }
}

现在,假设我稍后要使用该对象并需要它的面积,有什么更好的做法吗?该区域是否有字段或方法?

所以要么我只是实现这个:

fn area(&self) -> u32 {
    self.width * self.height
}

或者,由于面积是该对象固有的,我给对象一个“面积”字段:

struct Rectangle2 {
    width: u32,
    height: u32,
    area: u32,
}

并改为像这样实施新方法:

fn new(width: u32, height: u32) -> Self {
    Rectangle2 { 
        width, 
        height,
        area: width * height,
    }
}

现在在代码的其他地方,当需要区域时:

let rect1 = Rectangle1::new(30, 50);

let rect2 = Rectangle2::new(30, 50);

println!(
    "The area of the rectangle 1 is {} square pixels.",
    rect1.area()
);
println!(
    "The area of the rectangle 2 is {} square pixels.",
    rect2.area
);

在这个简单的示例中,我看不出哪一个比另一个更好。无论如何应该首选什么?有没有一种方法因为我不知道的事情而不太常见?

TLDR;这取决于用例。

恕我直言

这开始变得非常固执己见。一般来说,您的答案将由用例驱动。

根据经验,在现代系统上,最好将依赖参数保留为函数,并且仅将结果缓存作为特例进行优化。

示例 1:

长和高在矩形的整个生命周期内保持不变;预先计算可能会有用。 (考虑必须对 10^6 个矩形执行此操作,例如)

示例 2:

你的身高和身长被修改了……那你会预先计算吗?你缓存结果吗?

示例 3:

您正在根据用户更新其他两个参数中的任何一个来不断更新第三个参数:-)

@prog-fh 评论访问内存很昂贵。我会说你必须考虑这两种方式。将两个值提取到 CPU 中并计算它可能比仅访问一个预先计算的值更昂贵。

所以恕我直言,并且与每个人所说的一致,

视情况而定:-)