Rust中如何让函数参数同时兼容String与&str类型
解决Rust构造函数同时兼容&str和String的问题
针对你的Element结构体构造函数需要同时接受&str和String的需求,最简洁的方案是利用Rust的Into<String> trait,让构造函数参数支持所有能转换为String的类型,包括&str和String本身。
修改后的构造函数代码
pub struct Element { pub count: i32, pub name: String, } pub fn element(count: i32, name: impl Into<String>) -> Element { Element { count, name: name.into(), } }
或者写成泛型形式(效果完全一致,只是写法不同):
pub fn element<T: Into<String>>(count: i32, name: T) -> Element { Element { count, name: name.into(), } }
调用示例
现在不管你传入字符串字面量(&str)还是String类型,都不需要手动转换:
// 测试场景:直接传&str #[test] fn test_element_creation() { let h = element(1, "H"); assert_eq!(h.name, "H"); assert_eq!(h.count, 1); } // 非测试场景:直接传String fn main() { let o_name = String::from("O"); let o = element(2, o_name); // 也可以直接传String的构造表达式 let c = element(1, String::from("C")); }
原理说明
String类型本身实现了Into<String>,调用into()时直接返回自身,没有额外开销。&str类型也实现了Into<String>,调用into()时会自动执行to_string()完成转换,和你之前手动调用的逻辑一致,但不需要显式写出来。
这种方式既避免了测试时反复写.to_string(),也不用在非测试场景把String转成&str,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Majestic_Monkey_
相关产品推荐
相关产品推荐

