在Rust中给出以下结构:
struct OrderLine {
price: f32,
quantity: f32,
}
impl OrderLine {
fn total(&self) -> f32 {
println!("total has been computed"); // this is used in the test bellow
self.price * self.quantity
}
}
我如何:
1.对于此结构体的每个示例,只计算total
值一次,即使此函数被多次调用(请参见下面的测试,了解预期行为的示例)。total
值必须是惰性计算的。我不希望在初始化结构体时预先计算它,例如在OrderLine::new
函数中。
1.保持total
和下划线值(price
和quantity
)之间的一致性:
1.如果我们允许它们改变,那么total
必须在下次被调用时重新计算。
1.或者,如果这不可能或太困难,则使此结构不可变以防止更改。
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_total_must_be_computed_only_once() {
let order_line = OrderLine {
price: 10.0,
quantity: 2.0,
};
println!("before calling total for the first time");
println!("{}", order_line.total());
println!("before calling total for the second time");
println!("{}", order_line.total());
// The actual output is:
// before calling total for the first time
// total has been computed
// 20
// before calling total for the second time
// total has been computed <- repeated
// 20
// The expected output is:
// before calling total for the first time
// total has been computed <- no repetition
// 20
// before calling total for the second time
// 20
}
}
2条答案
按热度按时间up9lanfz1#
另一种方法是使用
OnceCell
,其优点(与Option
方法相比)是不需要&mut self
访问:playground
bis0qfac2#
下面是使用
Option
的一种方法: