创建基本上是String,但与String不兼容的类型?

问题描述 投票:2回答:1

[我注意到,在我的项目中,我使用了很多String类型,它们并不是真正意义上的String,而是String中包含的特定类型的值,例如,通过使用正则表达式,但应从代码角度加以区别。有没有办法让编译器对我有所帮助?例如,考虑以下功能:

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);
}
types rust
1个回答
0
投票

如果取消注释main中的该行,除非正确地将“特定字符串类型”指定为do_something的参数,否则它将不会编译。仅出于演示目的,将FYI maindo_something放在示例的顶部。

use std::str::FromStr;
use std::fmt;

fn do_something(val_1: StringType1, val_2: StringType2) {
    println!("{}", val_1);
    println!("{}", val_2);
}

fn main() {
    let val_1: StringType1 = "hello".parse().unwrap(); 
    let val_2: StringType2 = "hello_2".parse().unwrap();
    let val_3: StringType2 = "hello_2".parse().unwrap();
    let val_4: StringType2 = "hello".parse().unwrap();
    do_something(val_1, val_2);
    //do_something(val_3, val_4);
}

#[derive(Debug, PartialEq)]
struct StringType1 {
    value: String
}

#[derive(Debug, PartialEq)]
struct StringType2 {
    value: String
}

impl FromStr for StringType1 {
    type Err = ();

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Ok(StringType1 {
            value: s.to_string()
        })
    }
}

impl FromStr for StringType2 {
    type Err = ();

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Ok(StringType2 {
            value: s.to_string()
        })
    }
}

impl fmt::Display for StringType1 {
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
        let str = self.value.as_ref();
        fmt.write_str(str)
    }
}

impl fmt::Display for StringType2 {
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
        let str = self.value.as_ref();
        fmt.write_str(str)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.