types - 创建一个基本上是String,但与String不兼容的类型?
问题描述
我注意到在我的项目中,我使用了很多String
类型,其中我并不是真的指String
s,而是包含在 a 中的特定类型的值String
,例如通过使用正则表达式无法区分,但应该与 a 区分开来代码视角。有没有办法让编译器帮助我?例如,考虑这个函数:
fn do_something(val1: String, val2: String) {}
fn main() {
let val1: String = "hello";
let val2: String = "hello2";
do_something(val1, val2);
}
有没有办法创建SpecificStringType1
,SpecificStringType2
所以第一个do_something
调用编译,但第二个没有?
fn do_something(val1: SpecificStringType1, val2: SpecificStringType2) {}
fn main() {
let val1: SpecificStringType1 = "hello";
let val2: SpecificStringType2 = "hello2";
let val3: SpecificStringType2 = "hello2";
let val4: SpecificStringType2 = "hello2";
do_something(val1, val2);
do_something(val3, val4);
}
解决方案
你可以String
用一个元组结构包装,创建一个新的不同类型:
// This is a custom type which just wraps String,
// however you can choose what it derives again.
#[derive(Clone, Debug)]
struct MyString(String);
// Since they are distinct types, type check will prevent using
// String as MyString and vice versa.
fn f1(s: &String, t: &String) -> bool {
return true;
}
fn f2(s: &String, t: &MyString) -> bool {
return false;
}
fn main() {
let s: String = "hello".to_string();
let ms = MyString("goodbye".to_string());
let MyString(ms_inner) = ms.clone();
println!("{:?}", &s);
println!("{:?}", &ms);
// Here is proof that it works.
println!("{}", f1(&s, &ms_inner));
println!("{}", f2(&s, &ms));
}
推荐阅读
- amazon-web-services - AWS 上的 Kubernetes 使用 Kops - kubectl 的 kube-apiserver 身份验证
- go - 如何从接口中提取具体结构
- datetime - SSRS Dateformat 最大日期问题
- apache-camel - 骆驼文件语言 SortBy 日期模式系统时间或文件名模式?
- css - flex-direction 中的神秘行为:column
- python - Python For 循环仅将最后一个值附加到列表
- android - 如何在 Kotlin 自定义 getter 中抛出异常并阻止应用程序运行?
- java - error: incompatible types: LinkedList2.Node cannot be converted to Node
- scala - Scala:获取字符串转换的通用函数
- redux - redux-observable use RxJS to emit progress actions for ajax call