gpt4 book ai didi

rust - 如何在没有结构包装的情况下为基元创建标称类型?

转载 作者:行者123 更新时间:2023-12-05 04:37:17 24 4
gpt4 key购买 nike

我有两种不同的 float ,LatitudeLongitude。我如何为这些不同的 float 创建标称类型,以便将语义含义为 Longitudef32 变量分配给类型和语义含义为 Latitude 的变量 是一个错误?我可以在没有包装原始类型的结构的情况下执行此操作吗?

type Longitude = f32;
type Latitude = f32;

fn main() {
let lng : Longitude = 42.0;
let lat : Latitude = lng; // <-- goal is a type error
println!("lat={}, lng={}", lat, lng);
}

我如何为 Rust 基元创建标称类型?

最佳答案

基于 Shepmaster's excellent answer to a related question 的简短回答: 你不能。你必须制作一个 struct 并定义转换器到/从那个新的 struct 和它支持的底层类型(转换器不会分两步,所以两种类型兼容f32 不会直接相互转换)。

例如:

struct Latitude(f32);

impl Latitude {
fn from_value(v: f32) -> Result<Latitude, ()> {
if v >= -90.0 && v <= 90.0 {
Ok(Latitude(v))
} else {
Err(())
}
}

fn value(&self) -> f32 {
self.0
}
}

这看起来像是毫无意义的样板文件,但在这种情况下,它确实提供了确保值合理的额外优势,其中 90 度以上的纬度是没有意义的,应该在构建时正确地拒绝。

关于rust - 如何在没有结构包装的情况下为基元创建标称类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70715771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com