2015-10-09 2 views
18

В Руст, это работает:Почему println! работать только для массивов длиной менее 33?

fn main() { 
    let a = [0; 32]; 
    println!("{:?}", a); 
} 

, но это не делает:

fn main() { 
    let a = [0; 33]; 
    println!("{:?}", a); 
} 

Compile ошибку:

error[E0277]: the trait bound `[{integer}; 33]: std::fmt::Debug` is not satisfied 
--> src/main.rs:3:22 
    | 
3 |  println!("{:?}", a); 
    |     ^the trait `std::fmt::Debug` is not implemented for `[{integer}; 33]` 
    | 
    = note: `[{integer}; 33]` cannot be formatted using `:?`; if it is defined in your crate, add `#[derive(Debug)]` or manually implement it 
    = note: required by `std::fmt::Debug::fmt` 

Я предполагаю, что функция std::fmt::Debug каким-то образом определяет типы с точностью до длиной 32 элемента, но затем прекращает обнаружение. Или почему это не работает?

ответ

19

К сожалению, Rust не поддерживает целые числа в качестве общих параметров. Поэтому нелегко реализовать черту (например, Debug) для каждого массива [T; N]. В настоящее время стандартная библиотека использует макрос легко реализовать черту на всю длину до 32.

Для вывода массива, вы можете легко преобразовать его в срезе (&[T]) таким образом:

let a = [0; 33]; 
println!("{:?}", &a[..]); 

Кстати: Обычно вы можете получить срез из массива, просто префикс &, но аргументы println работают немного иначе, поэтому вам нужно добавить полный диапазон индекса [..].

+4

[Только ссылка на реализацию макроса] (https://github.com/rust-lang/rust/blob/b30d8969e86fa2c9dd3b8e2e28ddda2202331f0f/src/libcore/array.rs#L112). Думаю, это может быть полезно. – soon

Смежные вопросы