我总是发现自己为包含实现Display
的某种类型的Vec
的 struct 编写了Display
.例如:
use std::fmt::Display;
struct VarTerm {
pub coeffecient: usize,
pub var_name: String,
}
impl Display for VarTerm {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}{}", self.coeffecient, self.var_name)
}
}
struct Function {
pub terms: Vec<VarTerm>,
}
impl Display for Function {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let strings = self
.terms
.iter()
.map(|s| format!("{}", s))
.collect::<Vec<String>>()
.join(" + ");
write!(f, "{}", strings)
}
}
fn main() {
let my_function = Function {
terms: vec![
VarTerm {coeffecient: 2,var_name: "x".to_string(),},
VarTerm {coeffecient: 4,var_name: "y".to_string(),},
VarTerm {coeffecient: 5,var_name: "z".to_string(),},
],
};
println!("All that work to print something: {}", my_function)
}
在我看来,这在很多地方看起来既笨重又丑陋--来自高级语言的我从来不是.iter()/.collect()
个三明治的粉丝(我有点理解为什么需要它,但当我90%以上的时间只是从Vec
到Vec
的时候,这很恼人).在这种情况下,format!()
呼叫也加剧了这种情况,我发誓这肯定是错误的方式.
我不确定这其中有多少是铁 rust 所固有的,有多少是我不知道正确的方法.我想要尽可能地接近这样的东西:
self.terms.map(toString).join(" + ")
,这是我在Scala之类的产品中所期望的.
我离那里有多近?在这个过程中,对于前面提到的iter
/collect
夹在一起,总体上有什么可以做的吗?