Generics 如何编写一个函数,该函数接受一个泛型枚举并在它包含字符串时打印它?
我有一个通用枚举:Generics 如何编写一个函数,该函数接受一个泛型枚举并在它包含字符串时打印它?,generics,enums,rust,Generics,Enums,Rust,我有一个通用枚举: enum Holder<T> { None, One(T), Two(T, T), } 我想写一个函数,它接受枚举,检查它是否为String类型,并打印它: fn print_name_from_enum<T>(hold: T) { match hold { Holder::Two(a, b) => println!("Your Name is {} {}", a, b), } } 但如
enum Holder<T> {
None,
One(T),
Two(T, T),
}
我想写一个函数,它接受枚举,检查它是否为String
类型,并打印它:
fn print_name_from_enum<T>(hold: T) {
match hold {
Holder::Two(a, b) => println!("Your Name is {} {}", a, b),
}
}
但如果我给出类型:
match hold {
Holder<String>::Two(a, b) => {
println!("Your Name is {} {}", a, b)
}
}
匹配保持{
持有人:两(a,b)=>{
println!(“你的名字是{}{}”,a,b)
}
}
编译器还抱怨:
错误:应为`=>`、`@`、`if`或`|`,但找到了`src/lib。rs:10:15
|
10 |持有人::两(a,b)=>{
|^此处应为`=>`、`@`、`if`或`|`中的一个
我如何解决这个问题?我做错了什么
解决方案
多亏了@mcarton,我发现了这个错误。应该是这样的
fn print_name_from_enum<T: ToString>(hold: Holder<T>) {
match hold {
Holder::Two(a, b) => {
println!("Your Name is {first} {second}", first = a.to_string(),
second = b.to_string())
}
_ => {
println!("ooPPs.")
}
}
}
fn从枚举打印名称(保留:持有者){
比赛暂停{
持有人:两(a,b)=>{
println!(“您的名字是{first}{second}”,first=a.to_string(),
第二个=b.到_字符串()
}
_ => {
println!(“ooPPs”)
}
}
}
我需要添加枚举类型作为参数,对于T,必须添加它的函数to_string()。fn从_enum打印名称(保持:T)
,这并不是说print\u name\u from\u enum
接受类型为Holder
的参数,而是任何没有任何约束的类型。您的意思是print\u name\u from\u enum(hold:Holder)
?“一个接受枚举的函数,检查它是否为字符串类型并打印它。”-这是不可能的。对于要获取枚举的函数,必须在编译时知道参数t
是什么。因此函数不能真正“测试”它-如果它需要它是字符串,那么它将编译或不编译。。
fn print_name_from_enum<T: ToString>(hold: Holder<T>) {
match hold {
Holder::Two(a, b) => {
println!("Your Name is {first} {second}", first = a.to_string(),
second = b.to_string())
}
_ => {
println!("ooPPs.")
}
}
}