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



作为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;这取决于用例

IMHO

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

在现代系统中,经验表明,最好将依赖参数作为函数,只在特殊情况下优化结果的缓存。

示例1:

长度和高度在矩形的使用寿命内保持不变;预先计算可能是有用的。(考虑必须对10^6个矩形进行此操作,例如(

示例2:

你的身高和长度会有所改变。。。那么你会预先计算吗?你缓存结果了吗?

示例3:

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

@prog fh评论说,访问内存很昂贵。我想说,你必须从两个方面考虑。在CPU中获取两个值并进行计算可能比只访问一个预先计算的值更昂贵。

所以IMHO,按照每个人的说法,

这取决于:-(

最新更新