类型绑定中的特性“未实现”?

Heinzi

考虑以下代码,该代码使用特征使数组的长度固定在类型中。

use std::marker::PhantomData;

pub trait MyLen {
    const LEN: usize;
}

pub struct Data<L: MyLen> {
    bytes: [u8; <L as MyLen>::LEN],
    _phantom: PhantomData<L>,
}

我可以发誓,几天前我看到类似的代码可以工作,但是现在我看到了

   Compiling playground v0.0.1 (/playground)
error[E0277]: the trait bound `L: MyLen` is not satisfied
 --> src/lib.rs:8:17
  |
4 |     const LEN: usize;
  |     ----------------- required by `MyLen::LEN`
...
8 |     bytes: [u8; <L as MyLen>::LEN],
  |                 ^^^^^^^^^^^^^^^^^ the trait `MyLen` is not implemented for `L`
  |
help: consider further restricting this bound
  |
7 | pub struct Data<L: MyLen + MyLen> {
  |                          ^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.
error: could not compile `playground`

此错误消息对我来说没有任何意义,尤其是建议没有意义。有什么想法我做错了吗?

游乐场:https : //play.rust-lang.org/? version = stable & mode = debug & edition = 2018 & gist =49c9a11106a46125eaa9612560966bac

瓦伦丁

首先,您需要使用该const_generics功能才能做到这一点。但是,这还不够,因为您还需要使用const_evaluatable_checked功能

添加const_generics功能后,问题将变得更加明显,并出现更具描述性的编译器错误。

error: constant expression depends on a generic parameter
  --> src\main.rs:37:12
   |
37 |     bytes: [u8; <L as MyLen>::LEN],
   |            ^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: this may fail depending on what value the parameter takes

error: constant expression depends on a generic parameter
  --> src\main.rs:34:30
   |
34 |     [u8; <L as MyLen>::LEN]: Sized,
   |                              ^^^^^
   |
   = note: this may fail depending on what value the parameter takes

缺少的部分是where [u8; <L as MyLen>::LEN]: (或where [u8; <L as MyLen>::LEN]: Sized)需要const_evaluatable_checked功能。需要where子句,以确保LEN不会评估溢出或使该数组无效的事物。

您可以在Rust编译器团队在此HackMD帖子上阅读有关它的更多信息

#![feature(const_generics)]
#![feature(const_evaluatable_checked)]
#![allow(incomplete_features)]

use std::marker::PhantomData;

pub trait MyLen {
    const LEN: usize;
}

pub struct Data<L: MyLen>
where
    [u8; <L as MyLen>::LEN]: ,
    // or
    // [u8; <L as MyLen>::LEN]: Sized,
{
    bytes: [u8; <L as MyLen>::LEN],
    _phantom: PhantomData<L>,
}

当然,哪个程序需要每晚编译。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

队列实现中的未绑定模块类型

来自分类Dev

Rust ndarray类型错误:未实现特征绑定

来自分类Dev

特征中未实现方法的返回类型

来自分类Dev

特征中未实现方法的返回类型

来自分类Dev

需要绑定在继承特性的关联类型上的特性

来自分类Dev

JAX-RS在ApplicationBinder中绑定泛型类型的实现

来自分类Dev

类型“ A”未实现特征“ A”

来自分类Dev

接口未绑定到实现

来自分类Dev

在特性和方法中实现泛型

来自分类Dev

特性`core :: ops :: Index <i32>`未实现

来自分类Dev

适用于方法链接的Groovy特性返回实现类型

来自分类Dev

适用于方法链接的Groovy特性返回实现类型

来自分类Dev

从成员函数类型中删除const的特性?

来自分类Dev

绑定类型提示接口到实现

来自分类Dev

在Play scala中为某些对象类型的Route参数实现自己的对象绑定器

来自分类Dev

RStudio-Markdown崩溃:(函数(srcref)中的错误:“ eval”中未实现的类型(29)

来自分类Dev

OCaml-未绑定类型构造函数

来自分类Dev

如何在HK2中注入未绑定的泛型类型?

来自分类Dev

未捕获的类型错误:无法读取 backend.js 中未定义的属性“绑定”

来自分类Dev

方案中的未绑定变量

来自分类Dev

python中的未绑定变量

来自分类Dev

ReadLine中的未绑定键

来自分类Dev

在 CommandBinding 中未执行绑定

来自分类Dev

x [-1L]中的错误!= x [-n]:未实现这些类型的比较

来自分类Dev

Rust的特性和实现

来自分类Dev

根据特性的通用实现

来自分类Dev

Rust的特性和实现

来自分类Dev

列表框中的 WPF 复选框:内容绑定未正确更新(即使已实现 INotifyPropertyChanged)

来自分类Dev

协议中的方法未实现

Related 相关文章

热门标签

归档