gpt4 book ai didi

rust - 我可以在 Rust 中定义我自己的 "strong"类型别名吗?

转载 作者:行者123 更新时间:2023-12-04 16:23:13 25 4
gpt4 key购买 nike

tl;dr 在 Rust 中,是否有“强”类型别名(或类型机制)使得 rustc对于可能是相同底层类型的混淆,编译器会拒绝(发出错误)?
问题
目前,可以定义相同底层类型的类型别名

type WidgetCounter = usize;
type FoobarTally = usize;
然而, 如果我错误地混淆了两个类型别名的实例,编译器将不会拒绝(发出错误或警告)。
fn tally_the_foos(tally: FoobarTally) -> FoobarTally {
// ...
tally
}

fn main() {
let wc: WidgetCounter = 33;
let ft: FoobarTally = 1;

// whoops, passed the wrong variable!
let tally_total = tally_the_foos(wc);
}
( Rust Playground )
可能的解决方案?
我希望有一个额外的关键字 strong
strong type WidgetCounter = usize;
strong type FoobarTally = usize;
这样之前的代码在编译时会导致编译器错误:
error[E4444]: mismatched type aliases
或者也许有一个聪明的技巧 struct那会达到这个目标吗?
或者定义一个宏来完成这个的 cargo 模块?

我知道我可以通过输入别名不同的数字类型来“破解”这个,即 i32 ,然后 u32 ,然后 i64等。但出于多种原因,这是一个丑陋的黑客攻击。

有没有办法让编译器帮助我避免这些自定义类型别名混淆?

最佳答案

Rust 有一个很好的技巧叫做 New Type Idiom只是为了这个。通过在元组结构中包装单个项目,您可以创建“强”或“独特”类型的包装器。
这个习语在tuple struct section中也有简要提及。 Rust 文档。
“新类型习语”链接有一个很好的例子。这是一种类似于您正在寻找的类型:

// Defines two distinct types. Counter and Tally are incompatible with
// each other, even though they contain the same item type.
struct Counter(usize);
struct Tally(usize);

// You can destructure the parameter here to easily get the contained value.
fn print_tally(Tally(value): &Tally) {
println!("Tally is {}", value);
}

fn return_tally(tally: Tally) -> Tally {
tally
}

fn print_value(value: usize) {
println!("Value is {}", value);
}

fn main() {
let count: Counter = Counter(12);
let mut tally: Tally = Tally(10);

print_tally(&tally);
tally = return_tally(tally);

// This is a compile time error.
// Counter is not compatible with type Tally.
// print_tally(&count);

// The contained value can be obtained through destructuring
// or by potision.
let Tally(tally_value ) = tally;
let tally_value_from_position: usize = tally.0;

print_value(tally_value);
print_value(tally_value_from_position);
}

关于rust - 我可以在 Rust 中定义我自己的 "strong"类型别名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69443534/

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