Rust为Command实现Envs trait时get_envs为何报递归调用错误?
报错原因
- 方法匹配优先级问题:你正在为
Command类型实现自定义Envstrait的get_envs方法,方法体内调用self.get_envs()时,Rust编译器会优先匹配当前正在实现的trait方法,而非你预想的标准库Command自带的不稳定get_envs方法,直接形成无限递归,触发recursive call site报错。 - 代码存在未定义项错误:返回值类型中的
<Command as ProcessEnvs>::Iter引用了未定义的ProcessEnvstrait,属于拼写错误,正确应该指向你自定义的Envstrait。
修复方案
你本来的需求就是规避标准库get_envs的不稳定特性报错,所以可以直接用标准库稳定提供的Command::envs()方法实现逻辑,该方法会返回所有已设置的环境变量迭代器,将迭代器收集为Vec<OsString>后调用into_iter()即可匹配你定义的关联类型:
use std::ffi::OsString; use std::process::Command; use std::vec; pub trait Envs { type Item; type Iter: Iterator<Item = Self::Item>; fn get_envs(&self) -> Self::Iter; } impl Envs for Command { type Item = OsString; type Iter = vec::IntoIter<OsString>; fn get_envs(&self) -> <Command as Envs>::Iter { // 按需调整map逻辑,以下示例是把环境变量拼接为"KEY=VALUE"格式的OsString self.envs() .map(|(k, v)| OsString::from(format!("{}={:?}", k.to_string_lossy(), v))) .collect::<Vec<_>>() .into_iter() } }
如果你坚持要调用标准库的不稳定get_envs方法,可通过完全限定语法明确指定调用目标,避免方法匹配到自定义的trait实现,但该写法仍然会触发不稳定特性报错:
// 仅作语法演示,会触发unstable library feature报错 fn get_envs(&self) -> <Command as Envs>::Iter { // 完全限定语法明确调用标准库Command的get_envs方法 std::process::Command::get_envs(self) }
内容的提问来源于stack exchange,提问作者Kendrick johnson
相关产品推荐
相关产品推荐

