作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两种不同的 float ,Latitude
和Longitude
。我如何为这些不同的 float 创建标称类型,以便将语义含义为 Longitude
的 f32
变量分配给类型和语义含义为 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/
我正在尝试熟悉 Nom,目前是第 5 版,其中没有 CompleteStr 和其他内容,因此相关问题不是很有帮助。 我怎样才能解析类似的东西 "@pook Some free text @anothe
假设我想创建一个多次使用另一个解析器的组合器,例如,解析由两种引号分隔的字符串: fn quoted>(f: F) -> impl Fn(&'a str) -> IResult where F
我是一名优秀的程序员,十分优秀!