直接从类型中获取rust命名的数组长度,而不使用具体变量

v1uwarro  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(102)

我将一个大小为3的数组类型命名为Sequence。从这种类型的对象中,Vec的条目将由有限自动机连续计算。自动机运行后,Vec保证包含Sequence(=3)的长度,或者在某些情况下多一个(=4)项。
我尝试使用Vec::with_capacity来使Vec适应最大可能的内存需求(=4)。为了避免无用的分配和丢弃Vec,我想在任何Sequence对象到达之前分配一次:

type Sequence = [ f64; 3 ];

fn main() {
    let mut accumulator: Vec<f64> = Vec::with_capacity( Sequence.len() + 1 );
    …
}

当然,这段代码不会编译,因为.len()只对示例有效,而对类型无效。但是在这个准备阶段,没有具体的Sequence变量。
我想避免一个难以阅读的类似C的结构,它的形式如下:

use std::mem::size_of;
type Sequence = [ f64; 3 ];

fn main() {
    let mut accumulator: Vec<f64> = Vec::with_capacity( size_of::<Sequence>() / size_of::<f64>() + 1 );
}

我的类型应该保持非常简单;对于泛型,我在这里读到了一个类似问题的很好的答案:但是我想知道对于我的非常直接的类型Sequence,是否有比定义一个泛型trait更简单的方法来完成这项工作。
例如,我知道我可以定义一个const并使用它,但这似乎会将类型信息从类型中分离出来;如果生 rust 允许的话,我想避免这种情况:

const SEQUENCE_LEN: usize = 3;
type Sequence = [ f64; SEQUENCE_LEN ];

fn main() {
    let mut accumulator: Vec<f64> = Vec::with_capacity( SEQUENCE_LEN + 1 );
}

出于同样的原因,当它们属于一起时,将它们保持在一起,我不想简单地使用像with_capacity(4)中的文字。

kmpatx3s

kmpatx3s1#

我觉得这不太好,但另一个选择是

type Sequence = [f64; 3];

pub fn get_vec() -> Vec<f64> {
    Vec::with_capacity(Sequence::default().len() + 1)
}

在释放模式下,它编译为与

type Sequence = [f64; 3];

pub fn get_vec_magic_number() -> Vec<f64> {
    Vec::with_capacity(4)
}

相关问题