Rust 如何实现ToString特性来创建一个逗号分隔的字符串,而不使用后面的逗号?
我有以下代码:Rust 如何实现ToString特性来创建一个逗号分隔的字符串,而不使用后面的逗号?,rust,Rust,我有以下代码: struct A { names: Vec<String>, } impl ToString for A { fn to_string(&self) -> String { // code here } } fn main() { let a = A { names: vec!["Victor".to_string(), "Paul".to_string()], }; p
struct A {
names: Vec<String>,
}
impl ToString for A {
fn to_string(&self) -> String {
// code here
}
}
fn main() {
let a = A {
names: vec!["Victor".to_string(), "Paul".to_string()],
};
println!("A struct contains: [{}].", a.to_string());
}
结构A{
姓名:Vec,,
}
impl ToString为一个{
fn到_字符串(&self)->字符串{
//代码在这里
}
}
fn main(){
设a=a{
姓名:vec![“Victor.to_string(),“Paul.to_string()],
};
println!(“结构包含:[{}]。”,A.to_string());
}
预期产出:
结构包含:[Victor,Paul]
实现这一目标的最佳方法是什么?我尝试了一些奇怪的“for each”和其他变体,但每种变体都会给我一个尾随逗号,如下所示:
use std::fmt;
impl fmt::Display for A {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let mut str = "";
for name in &self.names {
fmt.write_str(str)?;
fmt.write_str(name)?;
str = ", ";
}
Ok(())
}
}
维克多,保罗
当然,我以后可以把它关掉,但我对这门语言很感兴趣,所以我想知道这门语言的最佳实践。这只是我尝试过的一个例子,但没关系,我在问如何最有效地做到这一点。根据:
对于实现该特性的任何类型,都会自动实现该特性。因此,ToString
不应该直接实现:Display
应该实现,并且您可以免费获得ToString
实现
您可以这样实现显示:
use std::fmt;
impl fmt::Display for A {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let mut str = "";
for name in &self.names {
fmt.write_str(str)?;
fmt.write_str(name)?;
str = ", ";
}
Ok(())
}
}
而且您不需要调用来调用\u string
(但您可以):
注意显示的目的
:
Display
类似于,但Display
用于面向用户的输出,因此无法派生
如果您的目的是调试,则可以派生debug
:
#[derive(Debug)]
struct A {
names: Vec<String>,
}
fn main() {
let a = A { names: vec![
"Victor".to_string(),
"Paul".to_string(),
]};
// {:?} is used for debug
println!("{:?}", a);
}
结构提供了丰富的方法集合,因此您可以编写自己的Debug
实现:
impl fmt::Debug for A {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.debug_struct("A")
.field("names", &self.names)
.finish()
}
}
一切看起来都很棒,但我应该关心fmt.write_str()
返回值吗?编译器抱怨必须使用结果并给出警告。你是对的。调用必须由宏包装。我更新了答案。谢谢。你认为结案是重复的吗?@Shepmaster我认为这个问题不是重复的。这个问题是关于实现ToString
的,虽然最后可能意味着实现显示
,但问题与实现调试
不同。有人能指出一个资源,它澄清了自动为显示
启用ToString
的引擎盖下魔法吗?trait文档本身并没有提到这样的“免费”实现,而是提到了。这似乎违反直觉