添加 const 泛型时的“不受约束的泛型常量”

2024-04-07

我如何添加 const 泛型?假设我有一个 foo 类型:

pub struct foo <const bar: i64> {
    value: f64,
}

我想实现 mul 这样我就可以乘以 2foo在一起。我想治疗bar作为一个维度,所以foo<baz>{value: x} * foo<quux>{value: k} == foo<baz + quux>{value: x * k}, 如下:

impl<const baz: i64, const quux: i64> Mul<foo<quux>> for foo<baz> {
    type Output = foo<{baz + quux}>;

    fn mul(self, rhs: foo<quux>) -> Self::Output {
        Self::Output {
            value: self.value * rhs.value,
        }
    }
}

我收到一条错误消息,告诉我需要添加绑定位置{baz+quux}在输出类型的定义内。这到底是什么意思以及如何实现它?我找不到任何看似相关的信息where.


解决方案

我对你的代码进行了修改,可以正常工作:

impl<const baz: i64, const quux: i64> Mul<Foo<quux>> for Foo<baz>
    where Foo<{baz + quux}>: Sized {
    type Output = Foo<{baz + quux}>;

    fn mul(self, rhs: Foo<quux>) -> Self::Output {
        Self::Output {
            value: self.value * rhs.value,
        }
    }
}

我是如何到达那里的

我已经重现了您在没有添加的情况下收到的完整错误where以下条款:

error: unconstrained generic constant
  --> src/main.rs:11:5
   |
11 |     type Output = Foo<{baz + quux}>;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
help: try adding a `where` bound using this expression: `where [u8; {baz + quux}]: Sized`

现在,它建议的子句不是很有用,原因之一是:静态大小的切片的长度参数必须是usize,但我们的价值观baz and quux(及其总和)是i64。我想编译器作者会包含该特定建议,因为 const 泛型的主要用例是将数组大小嵌入类型中。我有在 GitHub 上打开了一个问题 https://github.com/rust-lang/rust/issues/82509关于这个诊断。

为什么这是必要的?

A where子句指定对某些通用代码元素(函数、类型、特征,或者在本例中为实现)的约束,该约束基于一个或多个通用参数或其派生必须满足的特征和生命周期。许多情况都有等效的简写,但总体要求是完全指定约束。

在我们的例子中,表面上看这个实现适用于任何组合baz and quux,但事实并非如此,由于整数溢出;如果我们为两者提供足够大的相同符号的值,则它们的总和不能表示为i64。这意味着i64在加法下不闭合。

我们添加的约束要求两个值的总和位于一个可能值的集合中i64,间接地,通过要求消耗它的类型的东西。因此,为两者提供 2^31baz and quux无效,因为结果类型Foo<{baz + quux}>不存在,所以它不可能实现Sized特征。虽然这在技术上是比我们需要的更严格的限制(Sized是比简单存在的类型更强的要求),所有Foo<bar>存在实施Sized,所以在我们的例子中是相同的。另一方面,如果没有约束,则where子句(显式或简写)指定此约束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加 const 泛型时的“不受约束的泛型常量” 的相关文章

随机推荐

  • “通常的算术转换”和“整数提升”是同一回事吗?

    通常的算术转换 和 整数提升 是同一回事吗 我读过 通常的算术转换 用于使表达式的操作数具有相同的类型 而 整数提升 用于提升小于的类型int to int 但在MSDN https msdn microsoft com en us lib
  • Bitbucket 与 Github 的优缺点比较 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Disclaimer This is a subjective question Please follow relevant guidelin
  • 可以在 Yii2 中更改动作类吗?

    是否可以更改动作类 http www yiiframework com doc 2 0 yii base inlineaction html Yii2以某种方式使用 类似于如何在配置文件中设置许多其他组件的类 我想扩展这个课程 这样我就可以
  • 如何在iOS SDK中删除两个字符串中的共同字母? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何删除两个字符串中的常见字母并使用剩余的唯一字母生成新字符串 例如 String 1 Optimus Prime String 2 Dej
  • 如何使用 kotlin 显示在 recyclerview 中选择的单个项目

    我们如何标记单个项目被选中Recyclerview使用科特林 当我选择一个项目并单击其他项目时 应取消选择之前选择的项目 这是我在 kotlin 中的适配器类 class ListAdapter var context Context va
  • notificationDataSetChanged() 不刷新可扩展列表视图

    我在用Expandable ListView其中的数据通过填充Sqlite数据库 我已经提供了从中删除群组的选项ExpandableListView它实际上删除了相应的row在数据库中 但是该活动不会刷新 并且删除的 案例 是可见的 直到人
  • 使用 spring.NET 配置静态属性

    使用 spring NET 配置以下类的最佳实践是什么 using System Collections Generic using Edu3 DTOModel namespace Edu3 Data SubsonicProvider Re
  • distanceTo 返回什么距离?

    是否考虑了海拔变化 我的意思是 如果我从这个三角形的左顶点开始并在右上顶点结束 它返回距离a还是b double distanceInMetersFloat initialPosition distanceTo finalPosition
  • 通过键与字典项绑定

    假设我有一些字典 我想将该字典中的项目绑定到某些控件 并且我想通过项目键进行绑定 public partial class Window1 Window public Window1 InitializeComponent Dictiona
  • angerlySetInnerHTML 和

    我的页面需要本地化 我用的是gettext 我的i18n 函数返回翻译后的字符串并替换 s带有提供参数的符号 据我所知 我不能 危险的设定 一个 JSX 元素 但是我需要插入打开和关闭标签 我无法将字符串分成多个部分 因为后端为我提供了这样
  • 如何知道图像是 RGB 还是 BGR 格式?

    有没有办法提前知道用作系统输入的图像是 RGB 还是 BGR 格式 我正在使用 OpenCV 和 java API 我想将输入图像转换为灰度或 L a b 颜色空间 但在 OpenCV 中 您必须首先指定要转换的图像是 RGB 还是 BGR
  • Ruby 的“open_uri”是否在读取或失败后可靠地关闭套接字?

    我一直在使用open uri拉下 ftp 路径作为数据源一段时间 但突然发现我几乎连续不断地收到 530 抱歉 已连接允许的最大客户端数 95 我不确定我的代码是否有问题 或者是否是其他人正在访问服务器 不幸的是 我似乎无法真正确定谁有问题
  • 带值的 NSArray

    如何创建一个带有填充值的 NSArray 也就是说 NSArray name NSArray alloc insert these values raju biju ramu 使用 NSArray initWithObjects 方法 记住
  • 验证 Rails 中的参数

    在我的 Rails 应用程序中 我想验证filter and post type params 两者都是可选的 但如果它们存在 则它们必须具有一个值 并且必须具有与有效值数组中的一个相匹配的值 在我的控制器中 我有两种检查它们的方法 def
  • 使用 ng-change、AngularJS 进行日期输入验证

    我正在使用 AngularJS 和AngularJS 引导程序 http angular ui github io bootstrap 在我的页面中 我有一个日期选择器指令 如下所示 div class p class input grou
  • ASP.NET 5 Identity 3 用户在应用程序重新启动后注销

    我们正在使用 ASP NET Identity 3 我们的用户会随机自动注销 为了重现此问题 我尝试重新启动应用程序 所有用户都退出 即使是那些已检查过的用户Remember me 它只发生在生产中 在开发环境中运行良好 Update 我们
  • R 包拼凑:行/列标题

    有没有办法使用 patchwork 包按行或列添加标题来组合绘图 前任 安排为 拼凑 是的 有一种方法可以在生成的图的排列中放置行或列的标签patchwork通过使用textGrob正如评论之一所建议的 p1 lt ggplot iris
  • $this->post codeigniter 不适用于其余 api

    我尝试与 this gt post 获取以 json 格式通过 post 发送的数据 例如 我无法得到任何结果 this gt post name 这是代码
  • Python“正则表达式”模块:模糊值

    我正在使用 模糊匹配 功能Regex https pypi python org pypi regex 模块 如何获得 匹配 的 模糊度值 它指示模式与字符串的差异程度 就像 Levenshtein 中的 编辑距离 一样 我以为我可以获取
  • 添加 const 泛型时的“不受约束的泛型常量”

    我如何添加 const 泛型 假设我有一个 foo 类型 pub struct foo