【问题标题】:Why are all indexes in Rust of type usize?为什么 Rust 中的所有索引都是使用类型的?
【发布时间】:2016-10-26 20:33:41
【问题描述】:

Rust 的 std::ops::Index<T> only 支持 Tusize。这背后的原因是什么?

此外,当您尝试使用其他任何东西时,没有“尝试使用 usize”的建议,只是“特征 [&'static str]: core::ops::Index<u8> 不满意”错误。这可能是因为他们计划支持更多类型T,但由于某种原因推迟了这样做?

【问题讨论】:

  • 其实是有提示的——"注意:切片索引的类型是usize"在数组上,而"类型std::vec::Vec<&str>不能被索引u8" 在向量上。诚然,它们并不像他们可能的那样清楚。 play.rust-lang.org/…

标签: indexing rust


【解决方案1】:

Rust 的 std::ops::Index<T> 仅支持 Tusize

这不是真的。例如,HashMap 接受键类型可以借用的任何类型(因此您可以使用 &str 索引 HashMap<String, _>)。

切片 只允许您使用usize 对它们进行索引,所有在内存中假装或实际上线性的容器类型也是如此。那是因为usize 是用于索引它们的正确 类型。任何其他类型要么无法访问容器的全部潜在范围,要么允许使用不可能存在的索引。

过去人们曾问过要向切片索引添加更小的类型,但这将是向后不兼容的,因此不会很快发生。

【讨论】:

  • 添加较小类型的索引如何向后不兼容?
  • @delnan 目前,some_arr[0] 有效,因为对于切片,Index 只有 一个 实现。如果您添加了其他人,编译器将无法再决定您想要哪一个。至少,我是这么记得的。
  • 哦,好点。有一种出路(除了更智能的推理):allow i32 indices
  • 我明白了。向后兼容性问题破坏了添加更多类型。谢谢!
  • @MikeWilliamson:首先,你忘记了 Rust 有类型推断。如果您可以突然u32 进行索引,那么由于存在多种可能的解决方案,Rust 根据其作为索引的用法推断变量类型的情况将不再编译。其次,您忘记了 Rust 还针对可能只有 16 位 usizes 的嵌入式处理器,这意味着 u32对于索引总是安全的。第三:当我说“切片”时,我指的是[T],而不是a..b,它是Range
猜你喜欢
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多