为什么我在for-loop中的元组上得到“值必须知道”的错误?

时间:2017-04-11 18:58:53

标签: rust

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循环中的类型。涡轮鱼::<似乎不起作用。

2 个答案:

答案 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