无法在大小泛型类型的函数内使用 mem::size_of 创建常量 (E401)
Can't create a constant using mem::size_of inside a function on a sized generic type (E401)
我有一个 Rust 程序,我一直在尝试使用 const 函数代替宏来在编译时生成各种常量(到目前为止效果很好),但我刚刚遇到了下面的代码片段无法编译的障碍,因为 size_of
采用通用参数,编译器说我不能使用函数签名中的参数:
const fn _IOC<T:Sized>(dir:u32, code:u8, nr:u8) -> u32 {
// use of generic parameter from outer function (E0401)
const size: usize = ::core::mem::size_of::<T>();
(dir << 30) | ((size as u32) << 16) | ((code as u32) << 8) | ((nr as u32))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let myioctl = _IOC::<[u8; 65]>(3, b'H', 0x06);
assert_eq!(myioctl, 0xC0414806);
}
}
这是错误:
error[E0401]: can't use generic parameters from outer function
--> src/lib.rs:3:48
|
1 | const fn _IOC<T:Sized>(dir:u32, code:u8, nr:u8) -> u32 {
| - type parameter from outer function
2 | // use of generic parameter from outer function (E0401)
3 | const size: usize = ::core::mem::size_of::<T>();
| ^ use of generic parameter from outer function
我不确定我是否理解 this specific error 为什么适用于上面的代码。我是否应该将其视为该语言当前不支持的编译器边缘情况,或者是否有一种方法可以实现我没有看到的这项工作?
您不应该将 size
声明为 const
。它应该只是一个常规的不可变变量:
let size = ::core::mem::size_of::<T>();
我有一个 Rust 程序,我一直在尝试使用 const 函数代替宏来在编译时生成各种常量(到目前为止效果很好),但我刚刚遇到了下面的代码片段无法编译的障碍,因为 size_of
采用通用参数,编译器说我不能使用函数签名中的参数:
const fn _IOC<T:Sized>(dir:u32, code:u8, nr:u8) -> u32 {
// use of generic parameter from outer function (E0401)
const size: usize = ::core::mem::size_of::<T>();
(dir << 30) | ((size as u32) << 16) | ((code as u32) << 8) | ((nr as u32))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let myioctl = _IOC::<[u8; 65]>(3, b'H', 0x06);
assert_eq!(myioctl, 0xC0414806);
}
}
这是错误:
error[E0401]: can't use generic parameters from outer function
--> src/lib.rs:3:48
|
1 | const fn _IOC<T:Sized>(dir:u32, code:u8, nr:u8) -> u32 {
| - type parameter from outer function
2 | // use of generic parameter from outer function (E0401)
3 | const size: usize = ::core::mem::size_of::<T>();
| ^ use of generic parameter from outer function
我不确定我是否理解 this specific error 为什么适用于上面的代码。我是否应该将其视为该语言当前不支持的编译器边缘情况,或者是否有一种方法可以实现我没有看到的这项工作?
您不应该将 size
声明为 const
。它应该只是一个常规的不可变变量:
let size = ::core::mem::size_of::<T>();