面试题答案
一键面试use std::fmt::{self, Display, Error, Formatter};
use std::str::FromStr;
// 定义结构体
struct Complex {
real: f64,
imaginary: f64,
}
// 实现序列化,将Complex实例转换为 "real+imaginary i" 格式的字符串
impl Display for Complex {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
write!(f, "{:.2}+{:.2} i", self.real, self.imaginary)
}
}
// 实现反序列化,从 "real+imaginary i" 格式的字符串转换回Complex实例
impl FromStr for Complex {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let parts: Vec<&str> = s.split('+').collect();
if parts.len() != 2 {
return Err(Error);
}
let real = parts[0].parse::<f64>()?;
let imaginary_str = parts[1].trim_end_matches(" i");
let imaginary = imaginary_str.parse::<f64>()?;
Ok(Complex { real, imaginary })
}
}
你可以使用以下方式测试:
fn main() {
let num = Complex { real: 3.14, imaginary: 2.71 };
let serialized = num.to_string();
println!("Serialized: {}", serialized);
let deserialized: Result<Complex, _> = serialized.parse();
if let Ok(deserialized_num) = deserialized {
println!("Deserialized: real = {}, imaginary = {}", deserialized_num.real, deserialized_num.imaginary);
} else {
println!("Deserialization failed");
}
}