Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何实现ToString特性来创建一个逗号分隔的字符串,而不使用后面的逗号?_Rust - Fatal编程技术网

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文档本身并没有提到这样的“免费”实现,而是提到了。这似乎违反直觉