Rust泛型函数编写遇阻:Trait实现不够通用问题求助
适配
T<'a>约束的泛型函数实现 原始可编译代码
trait T<'a> {} impl<'a> T<'a> for &'a str {} fn takes_fn(f: impl Fn(&str)) {} fn take_both<'a, X:T<'a>>(a: &'a str, f: impl Fn(X) -> String) {} // 可正常编译的特定实现 fn specific() { takes_fn(|s| take_both(s, str::to_lowercase)) }
需求
编写泛版generic,替代specific,使其能接收任意参数类型实现T<'a>的函数(比如直接调用generic(str::to_lowercase))。
正确实现
fn generic<F>(f: F) where for<'a> F: Fn(&'a str) -> String, { takes_fn(move |s| take_both(s, f)) }
如果需要显式关联T<'a>约束,也可以写成:
fn generic<F, X>(f: F) where for<'a> X: T<'a>, for<'a> F: Fn(X) -> String, for<'a> X: std::convert::From<&'a str>, { takes_fn(move |s| take_both(s, f)) }
原尝试失败原因
generic_1失败:
函数级的生命周期'a是固定的,但takes_fn要求闭包能接收任意生命周期的&str。捕获了固定生命周期'a的f无法适配这个要求,导致编译错误。generic_2失败:
约束for<'a> X: T<'a>要求X对所有生命周期'a都实现T<'a>,但当前T<'a>仅为&'a str实现——不存在一个类型能同时满足所有生命周期的T<'a>约束(&'a str是绑定到特定生命周期的类型)。
验证调用
fn main() { generic(str::to_lowercase); // 可正常编译运行 }
内容的提问来源于stack exchange,提问作者lovasoa
相关产品推荐
相关产品推荐

