Function 如何使用关联的常量定义数组的长度?

Function 如何使用关联的常量定义数组的长度?,function,rust,traits,Function,Rust,Traits,我有一个特征,它表示可以通过UDP套接字发送的实体: pub trait ToNetEnt { const NET_SIZE: usize; fn from_net(data: &[u8]) -> Self; fn to_net(&self) -> &[u8]; } 虽然有一个关联的常量NET\u SIZE,但我无法在方法中使用它: pub fn req<T: ToNetEnt>(&self) -> T {

我有一个特征,它表示可以通过UDP套接字发送的实体:

pub trait ToNetEnt {
    const NET_SIZE: usize;

    fn from_net(data: &[u8]) -> Self;
    fn to_net(&self) -> &[u8];
}
虽然有一个关联的常量
NET\u SIZE
,但我无法在方法中使用它:

pub fn req<T: ToNetEnt>(&self) -> T {
    let buf: [u8; T::NET_SIZE];
}

我可以在此上下文中使用关联的常量吗?

要访问关联的常量,您需要使用稍微麻烦的语法明确说明它来自哪个特征:
::NET_SIZE

在编写本文时,这是不可能的。但让我们首先修复您的代码:

pub fn req<T: ToNetEnt>(&self) -> T {
    let buf: [u8; <T as ToNetEnt>::NET_SIZE];
    ...
}
pub-fn-req(&self)->T{
让buf:[u8;::净尺寸];
...
}

这应该是正确的语法,但目前无法编译:

error[E0277]:不满足特性绑定'T:ToNetEnt'
-->src/main.rs:6:19
|
6 |让buf:[u8;::净尺寸];
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ T`
|
=帮助:考虑添加一个“哪里T:调色剂”绑定
这只是问题的一个错误信息。见:

[U] 将关联的常量用作数组大小似乎不起作用:

pub trait Can {
    const SIZE: usize;
}

fn f<T: Can>(t: T) {
    // error[E0277]: the trait bound `T: Can` is not satisfied
    let x = [0u8; <T as Can>::SIZE];
}
pub-trait可以{
常量大小:usize;
}
fn f(t:t){
//错误[E0277]:未满足特性绑定'T:Can'
设x=[0u8;::SIZE];
}
错误消息显然是错误的,因此这可能是
rustc
中的错误,也可能是未实现的功能导致错误消息

在直接在结构中定义
const NET_SIZE
时,可以解决这个问题


您可以在GitHub问题上了解更多关于此特定错误的信息:。

这目前不起作用。请参阅True,它不能作为编译时常量工作。它确实起到了相同的作用。这是正确的;在相关的const和const泛型方面已经做了大量工作,很难跟踪,但是
T::NET_SIZE
在数组声明之外工作得很好。我想每个人都在期待const泛型。这将简化很多事情…酷;我也不确定你的第一句话——IMO
T::NET_SIZE
应该和
::NET_SIZE
一样好,而且超出了我在操场上的数组长度。因为它们都不起作用,我希望
::NET_SIZE
更清楚。GitHub上的链接评论也使用了这种语法,这强化了我的观点。我几乎总是在关联类型中使用
。这在常量关联类型中不需要吗?我的意思是它可能会工作,但谁知道呢?我们只能确定它何时降落。