[我注意到,在我的项目中,我使用了很多String
类型,它们并不是真正意义上的String
,而是String
中包含的特定类型的值,例如,通过使用正则表达式,但应从代码角度加以区别。有没有办法让编译器对我有所帮助?例如,考虑以下功能:
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);
}
如果取消注释main
中的该行,除非正确地将“特定字符串类型”指定为do_something
的参数,否则它将不会编译。仅出于演示目的,将FYI main
和do_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)
}
}