Generics 使用泛型参数创建字符串

Generics 使用泛型参数创建字符串,generics,rust,Generics,Rust,我有下面的泛型函数,现在希望将任何给定类型(如果可能)转换为字符串 fn write_row<T>(row: T) { let s: String = row.to_string(); } fn写入行(行:T){ 设s:String=row.to_String(); } 但这显然不起作用,因为T类型没有实现to_字符串 因此,我的问题是如何检查参数的类型,然后在需要时应用于字符串,以及如何告诉编译器我现在知道变量是已定义的类型?您可以告诉编译器T必须实现如下特征: use

我有下面的泛型函数,现在希望将任何给定类型(如果可能)转换为字符串

fn write_row<T>(row: T) {
    let s: String = row.to_string();
}
fn写入行(行:T){
设s:String=row.to_String();
}
但这显然不起作用,因为T类型没有实现to_字符串


因此,我的问题是如何检查参数的类型,然后在需要时应用于字符串,以及如何告诉编译器我现在知道变量是已定义的类型?

您可以告诉编译器
T
必须实现如下特征:

use std::string::ToString;

fn write_row<T: ToString>(row: T) {
    let s: String = row.to_string();
}
使用std::string::ToString;
fn写入_行(行:T){
设s:String=row.to_String();
}

太好了,但是如果我还想允许没有to_string方法的字符串…@TM90你是什么意思?如果它是一个字符串,则无需调用
to_string
。我的意思是,如果我还想为write_row方法允许一个字符串,然后跳过to_字符串part@TM90对字符串调用
是无害的。不要通过检查类型来增加复杂性。顺便说一句,我认为使用
Display
bound而不是
ToString
更为惯用。后者只是一种辅助特性,提供了方便的
ToString
功能,而前者提供了核心转换功能
ToString
对所有
Display
类型都有一个全面的实现。此外,您还可以在格式化宏中使用
显示
类型:
格式化!(“{}”,行)