2017-05-21 5 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

문제는이 []의 유형을 추론 할 수없는 사실이다. 형식 검사기에서는 PartialEq 특성 (==의 출처)을 사용하여 오른쪽이 다른 형식 인 인스턴스를 허용하기 때문에 []x.as_slice()과 같은 형식 인 것으로 가정 할 수 없습니다. 또한

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; 
    } 
    _ => {} 
} 

(I 위 할 것 같은 ref x과) 다른 것을 방지 할 x에 대한 참조를 복용 : 슬라이스가 is_empty()로 비어있는 경우 쉽게 대신 조각의 길이를보고, 또는 확인하여 해결할 수 있습니다 오류가 발생할 가능성이 있으며 x이 아직 소유되어있을 때 nodes으로 이동하는 것을 피하십시오.

+1

고마워!, 슬라이스를 추출 할 필요가 없기 때문에'Ok (ref x) if x.is_empty() '를 사용했다. –