2017-04-11 25 views
1
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() {} 

生成此錯誤:爲什麼我會在for循環中得到一個「必須知道的值」錯誤?

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循環中的類型。 Turbo-fish ::<似乎不起作用。

+1

爲什麼'self.plugins.as_ref()'?在推廣引起歧義時,您正在推廣參考。嘗試'self.plugins.iter()' – user2722968

+0

@ user2722968我還是一個新的生鏽,所以我敢肯定,我在網絡上的某個地方撿起as_ref()作爲壞習慣^ - ^ – eiko

回答

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

您的函數實際上會返回Option<&Blueprint>,因爲你從&self開始。您還應該使用self.plugins.iter()plugin_blueprints.1.iter()來阻止as_ref()引入的歧義並修復您的生活。

here

相關問題