< 返回版块

Neutron3529 发表于 2021-01-02 16:05

我想自己写一个bitmap(因为现在bool占用一个字节而不是一个二进制Bit) 我试了试这个:

#![feature(min_const_generics)]
#![feature(const_generics)]
#![feature(const_evaluatable_checked)]
const fn bit_length(N:usize)->usize{1+((N as isize -1)/64isize) as usize}
#[derive(Debug,Clone,Copy)]
struct Bit<const N:usize>([i64;bit_length(N)]);
impl<const N: usize> Bit<N>{
  fn new()->Self{
    Bit([0;N])
  }
}
fn main(){
  println!("{:?}",Bit::<12>::new())
}

然后被告知,

error: unconstrained generic constant
 --> test.rs:6:27
  |
6 | struct Bit<const N:usize>([i64;bit_length(N)]);
  |                           ^^^^^^^^^^^^^^^^^^^
  |
help: consider adding a `where` bound for this expression
 --> test.rs:6:32
  |
6 | struct Bit<const N:usize>([i64;bit_length(N)]);
  |                                ^^^^^^^^^^^^^

error: aborting due to previous error; 2 warnings emitted

如果把这里的bit_length(N)改成N,可以通过编译,(但这样Bit代表的是少于64N个bool,而非固定的N个bool)

想问一下大家有没有什么办法处理这种问题(又或者说这个常数泛型还没实现好?)

评论区

写评论
作者 Neutron3529 2021-01-04 12:11

原来是这样

我以为where是给bit_length加的,没想到要给整个数组加

学到了!

谢谢:)

--
👇
uno: 提示不是很明显了么,叫你加where约束。而且你new方法里不太对。

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=8af01b27dd2decf9f88a2cde43294be5

uno 2021-01-04 10:08

提示不是很明显了么,叫你加where约束。而且你new方法里不太对。

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=8af01b27dd2decf9f88a2cde43294be5

ezlearning 2021-01-03 22:52

数组的N可以为常量哈。

const ARRAY_LENGTH: usize = 10;

fn main() {
    let array = [0; ARRAY_LENGTH];
    println!("{:?}", array);
}
作者 Neutron3529 2021-01-03 20:15

感谢回复

我希望搞一些定长的bitmap(用于应付leetcode里面可以打表的题目)

现在的问题是长度只能手动计算,不能自动计算

我之前看到过,定义数组长度的时候,数组长度[T;N]里面的N可以是常量表达式而非常量

我不知道在常量泛型里面该如何把N定义成常量表达式

--
👇
ezlearning: 处理二进制bit需要用到shift,mask之类的, 可以参考别人怎么处理的哈:

https://github.com/image-rs/image/blob/master/src/codecs/bmp/decoder.rs

ezlearning 2021-01-02 21:59

处理二进制bit需要用到shift,mask之类的, 可以参考别人怎么处理的哈:

https://github.com/image-rs/image/blob/master/src/codecs/bmp/decoder.rs

1 共 5 条评论, 1 页