Eu tenho uma característica de tag que possui uma constante associada:
trait Trait {
const N: usize;
}
Eu tenho um tipo genérico, limitado pela característica. Eu gostaria de poder usar N
na declaração:
struct S<T: Trait> {
field: [f64; T::N],
}
Minha expectativa é que, para qualquer implementação Trait
que especifique N
, eu possa ter um S
array com tantos carros alegóricos nele. Em vez disso, recebo o seguinte erro do compilador:
error: generic parameters may not be used in const operations
--> src/main.rs:8:18
|
8 | field: [f64; T::N],
| ^^^^ cannot perform const operation using `T`
|
= note: type parameters may not be used in const expressions
error[E0392]: parameter `T` is never used
--> src/main.rs:7:10
|
7 | struct S<T: Trait> {
| ^ unused parameter
|
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
For more information about this error, try `rustc --explain E0392`.
Embora eu entenda o erro em si, não entendo o motivo ou como contorná-lo.
Uma solução alternativa para usar um tipo associado é usar
typenum
números inteiros:Parque infantil .
Embora não seja o ideal, tomei o comentário de Chayim Friedman como uma solução possível. Em vez de fazer com que o tipo associado seja uma constante indicando o número de elementos, pode ser o próprio tipo de armazenamento:
O
trait
precisa de umimpl
para definir issoconst N
.Experimente isto: