首页 > 解决方案 > 创建一个基本上是String,但与String不兼容的类型?

问题描述

我注意到在我的项目中,我使用了很多String类型,其中我并不是真的指Strings,而是包含在 a 中的特定类型的值String,例如通过使用正则表达式无法区分,但应该与 a 区分开来代码视角。有没有办法让编译器帮助我?例如,考虑这个函数:

fn do_something(val1: String, val2: String) {}

fn main() {
    let val1: String = "hello";
    let val2: String = "hello2";
    do_something(val1, val2);
}

有没有办法创建SpecificStringType1SpecificStringType2所以第一个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);
}

标签: typesrust

解决方案


你可以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));
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a32994fab2cabb6495807726f246da1e


推荐阅读