Rust中如何复用From<&str>与From<&String>的实现代码?
消除Rust中FQN结构体From实现的代码重复
你当前为FQN<'a>分别实现了From<&'a str>和From<&'a String>,代码逻辑完全重复,尝试的通用实现报错是因为传入的T可能是拥有所有权的类型(比如String本身),函数结束后fqn会被销毁,返回的FQN持有了它的引用,导致悬垂引用。
解决方案:限制实现为引用类型
通过将From的实现限定在引用类型上,确保引用的生命周期与FQN<'a>的生命周期绑定,避免悬垂引用问题,同时覆盖&str和&String的场景:
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct FQN<'a>(&'a str); impl<'a, T: ?Sized> From<&'a T> for FQN<'a> where T: AsRef<str>, { fn from(fqn: &'a T) -> Self { let fqn_ref = fqn.as_ref(); if fqn_ref.split('.').count() < 2 { panic!("Invalid FQN: {}", fqn_ref); } FQN(fqn_ref) } }
代码说明
T: ?Sized:允许处理不定大小类型(比如str),确保&'a str能被正确匹配&'a T:明确接收生命周期为'a的引用,保证as_ref()得到的&str生命周期也是'a,不会出现悬垂引用- 这个实现会自动适配
&'a str和&'a String,因为两者都满足AsRef<str>trait,完全消除了代码重复
验证使用
fn main() { // 用&str构造 let s = "foo.bar"; let fqn1: FQN = s.into(); // 用&String构造 let string = String::from("baz.qux"); let fqn2: FQN = (&string).into(); println!("{:?}, {:?}", fqn1, fqn2); }
内容的提问来源于stack exchange,提问作者Christopher Rybicki
相关产品推荐
相关产品推荐

