强制进行更严格的类型检查

Gus*_*son 2 rust

我有一个关于 Rust 中定义类型的问题。作为示例,我定义了两种类型:

pub type Distance = f32;
pub type Cost = f32;
Run Code Online (Sandbox Code Playgroud)

我定义这些类型而不是直接使用 f32 的原因是为了代码清晰,并尝试在我犯错误/思考错误时捕获。

例如,我有一个函数。

pub fn calculate_cost_from_distance(distance : Distance) -> Cost
Run Code Online (Sandbox Code Playgroud)

但是,我可以将 Cost 传递到该函数中,而不会受到编译器的任何抱怨(因为它们都是真正的 f32)。

所以,我的问题是,有什么方法可以强制编译器将此类类型视为不同的类型并抛出错误?

如果可能的话,最好不必为距离和成本创建完全自定义的类型,重新定义所有运算符等,因为我希望它们在使用时表现得像浮点数一样。

非常感谢任何想法或其他方法来解决这个问题!

Sam*_*Bob 6

您想使用newtype而不是类型别名 ( type) 即

pub struct  Distance(f32);
pub struct  Cost(f32);
Run Code Online (Sandbox Code Playgroud)

请参阅https://doc.rust-lang.org/rust-by-example/generics/new_types.html