Using Rust
记录一些在写 Rust 时遇到的错误和重构 Ownership let mut reader = BufReader::new(stream_reader); let mut buffer = String::new(); serde_json::to_writer(&mut stream, &cli.command).unwrap(); stream.flush().unwrap(); reader.read_line(&mut buffer).unwrap(); let response = buffer .trim_end() .to_string() .split(':') .collect::<Vec<&str>>(); 这段代码会在 .to_string() 这里报错, 因为 .trim_end() 返回一个 &str .to_string() 将这个 &str 转换为一个新的临时 String(拥有所有权的新字符串) 在这个临时 String 上调用 .split(’:’),这会返回一个迭代器,产生 &str 切片 临时 String 在语句结束时被丢弃,导致这些切片变成悬垂引用 修改思路有几种: 直接收集 String let response = buffer .trim_end() .split(':') .map(|s| s.to_string()) .collect::<Vec<String>>(); 直接引用原始的 buffer let response = buffer.trim_end().split(':').collect::<Vec<&str>>(); Generics fn create_engine(engine_name: &str) -> Result<Box<dyn KvsEngine>> { match engine_name { "kvs" => { let kvs = KvStore::open(current_dir()?)?; Ok(Box::new(kvs)) } "sled" => { let sled = SledKvsEngine::new(sled::open("kvs.db")?); Ok(Box::new(sled)) } _ => { panic!("Invalid engine name"); } } } 如果想用泛型的静态分配, 就必须分离引擎的创建逻辑 ...