为什么 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
(注意反之则不然)。同样的想法适用于 TryFrom
和 TryInto
。所以下面的代码将按预期工作。
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
转换失败。
看看:
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
(注意反之则不然)。同样的想法适用于 TryFrom
和 TryInto
。所以下面的代码将按预期工作。
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
转换失败。