11

テストの一環として、関数が適切な内容のベクトルを返すことをアサートしたいと思います。したがって、期待されるデータを静的変数として使用できるようにしました。ただし、マネージド ベクターの内容を静的ベクター変数と比較する適切な方法が見つかりません。

#[test]
fn test_my_data_matches_expected_data () {
  static expected_data: [u8, ..3] = [1, 2, 3];
  let my_data: ~[u8] = ~[1, 2, 3];  // actually returned by the function to test

  // This would be obvious, but fails:
  // -> mismatched types: expected `~[u8]` but found `[u8 * 3]`
  assert_eq!(my_data, expected_data);

  // Static vectors are told to be available as a borrowed pointer,
  // so I tried to borrow a pointer from my_data and compare it:
  // -> mismatched types: expected `&const ~[u8]` but found `[u8 * 3]`
  assert_eq!(&my_data, expected_data);

  // Dereferencing also doesn't work:
  // -> type ~[u8] cannot be dereferenced
  assert_eq!(*my_data, expected_data);

  // Copying the static vector to a managed one works, but this
  // involves creating a copy of the data and actually defeats
  // the reason to declare it statically:
  assert_eq!(my_data, expected_data.to_owned());
}

更新:比較する前に静的ベクターへの参照を割り当てると問題が回避されるため、最終的にはベクターが等しいことをアサートするための小さなマクロが作成されました。

macro_rules! assert_typed_eq (($T: ty, $given: expr, $expected: expr) => ({
  let given_val: &$T = $given;
  let expected_val: &$T = $expected;
  assert_eq!(given_val, expected_val);
}))

使用法:assert_typed_eq([u8], my_data, expected_data);

4

1 に答える 1

7

[u8, .. 3]実際には、固定長のもの ( ) と静的スライス ( )の 2 種類の静的ベクトルがあります&'static [u8]。前者は、他のタイプのベクトルとうまく相互作用しません。後者はここで最も役に立ちます:

fn main() {
    static x: &'static [u8] = &[1,2,3];

    let y = ~[1u8,2,3];
    assert_eq!(y.as_slice(), x);
}
于 2013-05-08T14:08:21.267 に答える