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.")
        }
    }
}