Rust "черта` std :: array :: LengthAtMost32` не реализована " - PullRequest
1 голос
/ 01 мая 2020

Почему это работает,

let a = Box::new([2; 10]);
println!( "foo {:?}", a );

Но это не так,

let a = Box::new([2; 100]);
println!( "foo {:?}", a );

Почему длина массива определяет реализации свойств? Ошибка кажется не связанной с вопросом. И наоборот, как можно добиться желаемого эффекта с помощью приведенного выше кода.

Воспроизводится ошибка:

error[E0277]: arrays only have std trait implementations for lengths 0..=32
 --> ./test.rs:4:27
  |
4 |     println!( "foo {:?}", a );
  |                           ^ the trait `std::array::LengthAtMost32` is not implemented for `[{integer}; 100]`
  |
  = note: required because of the requirements on the impl of `std::fmt::Debug` for `[{integer}; 100]`
  = note: required because of the requirements on the impl of `std::fmt::Debug` for `std::boxed::Box<[{integer}; 100]>`
  = note: required by `std::fmt::Debug::fmt`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.

1 Ответ

2 голосов
/ 01 мая 2020

Из документов на array

Это ограничение на размер N существует, поскольку Rust еще не поддерживает код, который является общим c над размер типа массива. [Foo; 3] и [Бар; 3] являются экземплярами одного и того же родового c типа [T; 3], но [Foo; 3] и [Foo; 5] - это совершенно разные типы. В качестве временного ограничения реализации черты статически генерируются до размера 32.

Это отвечает на оба моих вопроса:

  • В Rust отсутствуют универсальные выражения размер типа массива
  • 32 был просто приемлемым компромиссом, и для этого нет веских технических причин. Кажется, что эта черта названа так, потому что она применяется с макросом.

А с этот вопрос , приемлемого обходного пути для этого не существует. Это просто жесткое ограничение.

...