2017-05-21 30 views
0

我有一个函数返回Result<Vec<&str>, String>的节点列表。我的意图是检查一个错误或一个空的向量来提前返回,或者如果有一个列表,则继续。匹配一个错误或一个空结果

这是我正在尝试,除了其他事情,但编译器抱怨x的类型。

let nodes = list_nodes(client, &service); 
match nodes { 
    Err(e) => { 
     println!("Unable to list nodes: {:?}", e); 
     return; 
    }, 
    Ok(x) if x.as_slice() == [] => { 
     println!("No nodes found for service: {}", service); 
     return; 
    } 
    _ => {} 
} 

的错误是:

error[E0282]: type annotations needed 
    --> src/main.rs:28:18 
    | 
28 |   Ok(x) if x.as_slice() == [] => { 
    |     ^^^^^^^^^^^^^^^^^^ cannot infer type for `A` 
+0

我认为你需要包含更多的上下文代码。例如,'A'出现在错误消息中,但不在您的代码示例中。请参阅https://stackoverflow.com/help/mcve –

+0

@PeterHall,在我的代码中没有A,你看到的是我从编译器得到的,没有更多的上下文可以给。 –

+0

@Arkaitz,试试'&x ==&[]'。现在您正在比较切片参考和一个空数组。 – red75prime

回答

2

这个问题实际上是它不能推断的[]类型。类型检查器不能假定[]这里的类型与x.as_slice()的类型相同,因为PartialEq特征(其中==来自)允许右侧与左侧类型不同的实例。您可以轻松地在片的长度看,而不是,或检查解决它,如果切片是空的,is_empty()

match nodes { 
    Err(e) => { 
     println!("Unable to list nodes: {:?}", e); 
     return; 
    }, 
    Ok(ref x) if x.as_slice().is_empty() => { 
     println!("No nodes found for service: {}", service); 
     return; 
    } 
    _ => {} 
} 

此外,拍摄到x参考(与ref x就像我之前所做的那样),可防止其他错误,你可能会得到,避免移动x当它仍然拥有nodes

+1

谢谢!我结束了使用'好(参考x)如果x.is_empty()',因为没有必要提取一个切片 –

相关问题