struct Plugin;
struct Blueprint<'a>(&'a ());
struct Shell<'a> {
plugins: Vec<(&'a Plugin, Vec<Blueprint<'a>>)>,
}
impl<'a> Shell<'a> {
fn find_blueprint(&self, name: &str) -> Option<Blueprint> {
for plugin_blueprints in self.plugins.as_ref() {
for blueprint in plugin_blueprints.1 {
if blueprint.name.to_string() == name {
return Some(blueprint);
}
}
}
None
}
}
fn main() {}
生成此错误:
error: the type of this value must be known in this context
--> src/main.rs:11:30
|
11 | for blueprint in plugin_blueprints.1 {
| ^^^^^^^^^^^^^^^^^^^
这让我感到困惑,因为plugin_blueprints
似乎明确是类型(&'a Plugin, Vec<Blueprint<'a>>)
。我不确定用什么语法(如果有的话)来指定for循环中的类型。涡轮鱼::<
似乎不起作用。
答案 0 :(得分:3)
因为您使用的是as_ref
,它比您想要的更通用。无法推断T
的值:
pub trait AsRef<T>
where T: ?Sized
{
fn as_ref(&self) -> &T;
}
迭代这个的惯用方法是
for plugin_blueprints in &self.plugins {}
这种非常讨厌的方法是使用消除歧义的函数调用语法在特征上使用turbofish:
for plugin_blueprints in AsRef::<[(&'a Plugin, Vec<Blueprint<'a>>)]>::as_ref(&self.plugins) {
答案 1 :(得分:1)
您的功能实际上会返回Option<&Blueprint>
,因为您从&self
开始。您还应该使用self.plugins.iter()
和plugin_blueprints.1.iter()
来阻止as_ref()
引入的歧义并修复您的生命周期。
请参阅here