2017-12-28 6 views
0

두 개의 배열이 동일하다는 것을 주장해야하는 몇 가지 테스트를 작성했습니다. 일부 테스트 어레이는 [u8; 48] 다른 사람의 크기와 유형이 [u8; 188] 있습니다큰 고정 크기 배열을 사용하는 어설 션 또는 인쇄 사용

#[test] 
fn mul() { 
    let mut t1: [u8; 48] = [248, 132, 131, 130, 138, 113, 205, 237, 20, 122, 66, 212, 191, 53, 59, 115, 56, 207, 215, 148, 207, 41, 130, 248, 214, 42, 124, 12, 153, 108, 197, 99, 199, 34, 66, 143, 126, 168, 88, 184, 245, 234, 37, 181, 198, 201, 84, 2]; 
    let t2: [u8; 48] = [232, 142, 138, 135, 159, 84, 104, 201, 62, 110, 199, 124, 63, 161, 177, 89, 169, 109, 135, 190, 110, 125, 134, 233, 132, 128, 116, 37, 203, 69, 80, 43, 86, 104, 198, 173, 123, 249, 9, 41, 225, 192, 113, 31, 84, 93, 254, 6]; 

    // some computation goes here. 

    assert_eq!(t1, t2, "\nExpected\n{:?}\nfound\n{:?}", t2, t1); 
} 

을 나는 하나, 여기에 여러 오류를 얻을 : t2[..] 또는 t1[..] 같은 슬라이스로 인쇄하려고

`[u8; 48]` cannot be formatted using `:?` 

작동하지 않는 것 같습니다.

binary operation `==` cannot be applied to type `[u8; 48]` 

가 어떻게 이러한 배열과 assert를 사용하여 프린트 할 : 또 다른 오류이 무엇입니까?

+0

개별적 각 요소에 대해 주장해야합니다. –

답변

4

비교 부분은 배열을 반복자로 변환하고 요소별로 비교할 수 있습니다.

assert_eq!(t1.len(), t2.len(), "Arrays don't have the same length"); 
assert!(t1.iter().zip(t2.iter()).all(|(a,b)| a == b), "Arrays are not equal"); 
+0

배열의 크기가 다르며 가장 짧은 배열의 마지막 요소 다음에 다른 배열이있는 경우에만이 작업이 수행되지 않습니다. PO가 절대적으로 2 개의'[T; N]'을 같은 'N'으로 바꾸지 만, 변경되면 까다로운 버그가 될 수 있습니다. – mcarton

+0

@mcarton 사실, 나는 나의 대답에 대해 또 다른 주장을했다. –

+1

그 일을하는 ['itertools :: Itertools :: all_equal'] (https://docs.rs/itertools/0.7.4/itertools/trait.Itertools.html#method.all_equal)도 있습니다. – mcarton

0

Vec을 만들 수 있습니다. 해결 방법으로

fn main() { 
    let a : [u8; 3] = [0,1,2]; 
    let b : [u8; 3] = [2,3,4]; 
    let c : [u8; 3] = [0,1,2]; 

    let va : Vec<u8> = a.to_vec(); 
    let vb : Vec<u8> = b.to_vec(); 
    let vc : Vec<u8> = c.to_vec(); 

    println!("va==vb {}", va == vb); 
    println!("va==vc {}", va == vc); 
    println!("vb==vc {}", vb == vc); 
} 
+0

'vec! (a)'가 하나를 만들 것입니다 요소 벡터, 한 요소는 슬라이스입니다. 이 내부 슬라이스는 길이가 32보다 작기 때문에 비교됩니다. – mcarton

+0

감사합니다. 'to_vec()'로 변경했습니다. – NovaDenizen

3

사용하여 조각

, 당신은 조각으로 배열을 만들기 위해 &t1[..] (대신 t1[..]의)를 사용할 수 있습니다. 에 대해이 작업을 수행하고 비교 및 ​​형식을 모두으로 지정해야합니다.

assert_eq!(&t1[..], &t2[..], "\nExpected\n{:?}\nfound\n{:?}", &t2[..], &t1[..]); 

또는

assert_eq!(t1[..], t2[..], "\nExpected\n{:?}\nfound\n{:?}", &t2[..], &t1[..]); 

포맷 배열은 직접

이상적으로, 원래의 코드는 컴파일해야하지만, 지금은하지 않습니다. 그 이유는 배열이 인 (예 : EqDebug)이 lack of const generics이기 때문입니다.

따라서 비교와 같은 짧은 배열을 포맷 할 수 있습니다 :

let t1: [u8; 32] = [0; 32]; 
let t2: [u8; 32] = [1; 32]; 
assert_eq!(t1, t2, "\nExpected\n{:?}\nfound\n{:?}", t2, t1);