【问题标题】:How to change the type of a tuple?如何更改元组的类型?
【发布时间】:2021-12-28 16:59:12
【问题描述】:

如何将(u8, u8) 转换为(usize, usize),以便像(u8, u8) == (usize, usize) 这样比较元组?

【问题讨论】:

  • 这将有助于展示您正在尝试做的事情的示例。您是否尝试过重新创建元组?
  • 如果你的元组是a和b,你总是可以使用(a.0 as usize, a.1 as usize) == b。

标签: rust types type-conversion


【解决方案1】:

由于 u8 是 not PartialEq<usize>,usize 是 not PartialEq<u8>,并且 Rust 在设计上没有原始类型之间的隐式转换,因此您需要将两个元组转换为相同类型以使它们成为PartialEq。

显式转换

根据 user4815162342

的建议

usize 不能小于u8,所以显式强制转换是安全的 u8 -> usize

(x.0 as usize, x.1 as usize) == y

但强制​​ usize -> u8 会静默截断。下面的 sn-p 将编译并声明 x 等于 y。

let x: (u8, u8) = (255, 255);
let y: (usize, usize) = (1000, 1000);

    

 if (y.0 as u8, y.0 as u8) == x {
    println!("x and y are equal");
 } else {
    println!("x and y are not equal");
 }

From特征转换

您也可以将u8 -> usize 与from 进行转换,因为usize 是From<u8>

(usize::from(x.0), usize::from(x.1)) == y 

请注意,usize -> u8 和 from 无法编译,因为 u8 不是 From<usize>。

(u8::from(y.0), u8::from(y.1)) == x 

这就是为什么它被认为是一种安全的转换方法。 Clippy 可以使用规则cast_lossless rule 检测可能进行此类转换的位置

Try_From特征转换

您还可以使用Try_From trait 进行从usize 到u8 的可失败转换。

match (u8::try_from(y.0), u8::try_from(y.1)) {
        (Ok(y_0), Ok(y_1)) => {
            if (y_0, y_1) == x {
                println!("x and y are equal");
            } else {
                println!("x and y are not equal");
            }
        },
        _ => panic!("Conversion from x type to y type failed")
}

如果usize 值大于u8::Max,则转换将导致Error。这也算是一种安全的转换方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2023-03-25
    • 1970-01-01
    • 2019-09-09
    • 2020-01-12
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多