Cow::Owned是如何实现FnOnce trait的?
问题解答:Cow::Owned为何能作为FnOnce传入Option::map
首先要明确:Cow::Owned并没有手动实现FnOnce trait,它能被传入Option::map的核心原因是Rust编译器会自动为函数项(function item)实现Fn/FnMut/FnOnce系列trait。
关键细节拆解
Cow::Owned是Cow枚举的一个关联函数,针对你的示例,它的签名是fn(&'static str) -> Cow<'static, str>,接收一个字符串切片并返回对应的Cow枚举实例。- 只要函数的参数和返回值类型符合
FnOnce(T) -> U的约束,Rust编译器就会自动为这个函数项生成FnOncetrait的实现,无需在源码中显式编写。
验证示例
你可以用自定义函数替代Cow::Owned,同样能正常运行:
use std::borrow::Cow; fn wrap_owned(s: &'static str) -> Cow<&'static str> { Cow::Owned(s.to_string()) } fn main() { let a = Some("Hello"); let b: Option<Cow<&'static str>> = a.map(wrap_owned); println!("{:?}", b); }
这个自定义函数也能被传入map,原理和Cow::Owned完全一致——编译器自动为它实现了FnOnce。
你在标准库源码中找不到相关实现,是因为这些trait的实现是编译器自动生成的,不属于标准库的显式代码范畴。
内容的提问来源于stack exchange,提问作者boundless-forest
相关产品推荐
相关产品推荐

