为什么 Rust 的 usize 到 u128 转换被认为是失败的?

Why is Rust's usize to u128 conversion considered failable?

看看:

use std::convert::{From, TryFrom};

fn main() {
  let size: usize = 42;
  let good: u128  = u128::try_from(size).unwrap(); // works fine
  let bad:  u128  = u128::from(size);              // doesn't compile!
}

据我所知,usize 是一个整数类型,它们永远不会大于 128 位。因此,我认为 usize -> u128 转换不可能失败。那么,为什么 u128 不实施 From<usize>

更新:Rust 的documentation 说:

From T for U implies Into U for T

虽然 usize -> u128 看起来不错,但 u128 -> usize 却不行。好的,但是为什么 Into<u128> 没有为 usize 实现呢?

From trait的文档说

Note: This trait must not fail. If the conversion can fail, use TryFrom.

由于您不知道 usize 是否可以保存 u16/u32/u64/u128 值(取决于您的编译目标),所有这些原始类型都实现 TryFrom 而不是 From.

在 Rust 文档中,implies 表示当你有一个类型实现 From 时,编译器会免费给你一个 Into(注意反之则不然)。同样的想法适用于 TryFromTryInto。所以下面的代码将按预期工作。

use std::convert::{TryFrom,TryInto};

fn main() {
  let size: usize = 42;
  let good: u128  = u128::try_from(size).unwrap();
  let doublegood:usize = good.try_into().unwrap();
}

Though usize -> u128 seems fine, u128 -> usize doesn't. OK, but why isn't Into implemented for usize instead?

因为就 Rust 而言,虽然 usize 保证始终至少为 16 位,但不能保证总是至多 64 位。

它似乎不太可能有用,但从技术上讲,没有什么可以排除 256 位指针,并且由于 usize 保证为指针大小,因此会使 usize -> u128 转换失败。