我可以仅使用类型而不是具体变量来获取 Rust 数组的长度吗?

2023-12-14

我想将以下 C++ 代码重写为 Rust:

using storage = array<int, 3>;
const size_t storage_len = sizeof(storage) / sizeof(storage::value_type);

在没有具体变量的情况下如何获得恒定长度值?

作为动机,虽然看起来微不足道,但我想在不声明变量的情况下打印数组的元素计数。我知道我可以使用常量值或声明虚拟变量,但我想知道 Rust 如何保留 C++ 代码。

I admit 没有具体变量不清楚。我想实现上述 C++ 功能,但这个解释可能会产生误导。我很好奇是否有任何方法可以获取数组的元素类型。


Rust 现在支持 const 泛型。我留下了旧的答案,以便人们知道为什么有人会首先问这个问题。

自 Rust 1.51 以来的新答案:

pub trait Length {
    const LEN: usize;
}

impl<T, const LENGTH: usize> Length for [T; LENGTH] {
    const LEN: usize = LENGTH;
}

旧答案:

我知道您想仅从类型信息中检索数组长度。 Rust 没有内置的 PI 类型(又名:常量泛型)。这意味着通用参数是not该语言当前不支持类型(例如数组长度的整数)。

跟踪此问题的问题我们很可能在未来看到对它的支持,尽管不是在不久的将来。

如果必须的话,您可以通过为每种类型实现一个特征来解决该限制:

trait GetLength {
    fn len() -> usize;
}

impl<T> GetLength for [T; 0] {
    fn len() -> usize {
        0
    }
}

impl<T> GetLength for [T; 1] {
    fn len() -> usize {
        1
    }
}

// ...

fn main() {
    println!("{}", <[String; 1]>::len());
}

宏可以帮助防止重复输入:

trait GetLength {
    fn len() -> usize;
}

macro_rules! impl_get_length {
    ($v:expr) => {
        impl<T> GetLength for [T; $v] {
            fn len() -> usize {
                $v
            }
        }
    };
}

impl_get_length!{ 0 }
impl_get_length!{ 1 }

// ...

fn main() {
    println!("{}", <[String; 1]>::len());
}

板条箱喜欢typenum还有助于为现有语言中的 const 泛型提供一些支持。

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

我可以仅使用类型而不是具体变量来获取 Rust 数组的长度吗? 的相关文章

随机推荐

  • 使用 length/2 和 ord_subset/2 生成子集

    我是序言的初学者 我在 swipl 解释器中尝试过 length Lists 3 ord subset Lists 1 2 3 4 false 期望获得所有作为 1 2 3 4 子集的长度为 3 的列表 例如 1 2 3 或 1 2 4 为
  • 创建具有可拖动和可调整大小的选择窗口的自定义图片框

    我使用以下代码在图片框上绘制一个选择矩形 并允许用户选择它并将其拖动到所需的位置 我想要实现的是允许用户通过实现调整矩形大小的选项来调整矩形大小 目前我已经实现了以下目标 如何解决这个问题 public class DraggablePic
  • 复制 mongodb 集合

    使用 C 在同一服务器上复制 Mongodb 中的集合的正确方法是什么 MongoVUE 有一个选项 重复集合 C 有类似的选项吗 没有使用 C 驱动程序复制集合的内置方法 但您仍然可以非常简单地执行此操作 如下所示 var source
  • 函数只返回一次,为什么?

    在我的编码过程中 我确实陷入了这个问题 我跑了一个foreach循环 对于每个项目 我都必须从函数中获取特定的值 但我只收到一张退回的 我不明白发生了什么事 我希望你们一定会的 下面是我的程序的简短版本 最后给出了数据库结构
  • 为什么这个DateTimePicker脚本会导致IE6和IE7无法加载页面

    我在asp net MVC 3站点上有几个页面导致IE6和7在加载菜单后提示 无法加载页面 我已经能够通过以下方式解决此问题DateTimePicker script
  • 使用 NHibernate 更新 Top n

    我怎样才能让 NHibernate 产生这个 t sql 请求 更新前 n 个任务 设置修改 其中条件 我不想进行事务 批量更新 请检查一下 13 3 DML 风格的操作 引用的代码片段 ISession session sessionFa
  • 在 Windows Phone 应用程序中将动态 BitmapImage 转换为灰度 BitmapImage

    我想将位图图像转换为灰度位图图像 这是我从方法中获得的 因此 宽度和高度对我来说是未知的 我尝试过研究 WritableBitmapEx 和静态扩展方法等选项 但它们对我没有帮助 因为我希望返回数据类型为 BitmapImage 然后需要将
  • 如何更改 PostgreSQL 表并使列唯一?

    我在 PostgreSQL 中有一个表 其架构如下所示 CREATE TABLE foo table id serial NOT NULL PRIMARY KEY permalink varchar 200 NOT NULL text va
  • 定时自动注销和浏览器关闭

    我出于学习目的创建了一个非常简单的多用户游戏 当用户登录时 每个其他用户都会获得所有当前登录用户的更新 当用户登录时 它只是将该用户在 SQL 数据库中的值设置为 1 当用户注销时 该值应为 0 我正在使用 window unload fu
  • 快速读取并与Data.Table的Fread和Rbindlist合并

    我正在寻找一种使用 data table 的 fread 和 rbindlist 函数快速读取和合并一堆数据文件的方法 我认为如果 fread 可以将文件名向量作为参数 那么它可能是一个优雅的行 例如 mergeddata rbindlis
  • 如何计算逻辑向量中的 TRUE 值

    在 R 中 计算数量的最有效 惯用的方法是什么TRUE逻辑向量中的值 我可以想到两种方法 z lt sample c TRUE FALSE 1000 rep TRUE sum z 1 498 table z TRUE TRUE 498 你喜
  • Javascript 按名称获取子元素

    我正在传递一个 varel变成一个函数 el包含以前抓取的元素 使用 getElementById 并且当我 console logel在函数中我得到以下内容 当我尝试抓取内部的元素时 问题就出现了el using el getElemen
  • 串行端口 - 如何设置字符?

    考虑 Baud rate 19200 RTS on DTR on Data bits 8 Stop bits 1 Parity None Set chars Eof 0x00 Error 0x2A Break 0x2A Event 0x00
  • 如果使用 loadHTMLString 加载视图,如何在 uiwebview 中设置 http 标头

    我有一个UIWebView我正在加载使用loadHTMLString我需要在请求标头上设置cookie 我知道如何使用loadRequest但不加载网络视图loadHTMLString我没有请求对象 有人做过这样的事吗 从 loadRequ
  • 使用 open() 错误 22(Windows 路径)

    我无法让以下代码正常工作 path C Users jiversen Documents Jsons jsonName json with open path w as outfile json dump df outfile 我收到以下错
  • 类型错误:create_int():函数参数不兼容

    我最近一直在使用 python 学习计算机视觉 在制作手部检测器项目时 我遇到了这个错误 Traceback most recent call last File c Users idhant OneDrive 007lakshya Idh
  • 比较两个数组并以 github 风格呈现交集/差异

    我有两个按字母顺序排序的数组 每个数组都包含唯一的值 但某些值将在两个数组之间共享 示例数组 src apple cherry grape lemon orange strawberry dst apple banana cherry or
  • Hadoop 中的reduce 任务什么时候开始?

    Hadoop中reduce任务什么时候开始 它们是否在映射器完成一定百分比 阈值 后开始 如果是这样 这个阈值是固定的吗 通常使用什么样的阈值 reduce阶段有3个步骤 shuffle sort reduce Shuffle 是减速器从每
  • windowActivated 和 windowFocusGained 之间的区别

    windowActivated 方法 从 WindowListener 实现 和 windowGainedFocus 从 WindowFocusListener 实现 方法之间的主要区别是什么 Java 文档说 窗口获得焦点 当 Windo
  • 我可以仅使用类型而不是具体变量来获取 Rust 数组的长度吗?

    我想将以下 C 代码重写为 Rust using storage array