【问题标题】:Implement a new .clean() method on String在 String 上实现一个新的 .clean() 方法
【发布时间】:2021-09-24 14:23:27
【问题描述】:

我希望能够像这样获取一个字符串并在其上调用一个方法:

let s = String::new();
s.clean()

我想我会把它作为字符串的一个特征来实现,所以开始写这个:

trait Clean {
    fn clean(&mut self) -> Self {
        return self.trim_start_matches("\"");
    }
}

impl Clean for String {}

这至少有两个问题:

  1. 因为 self 可以是任何东西,所以不能保证它有 .trim_start_matches() 方法 - 所以 Rust 不会编译。
  2. 查看.trim_start_matches() 的签名,我认为它不会发生突变,所以我认为将 .clean() 附加到末尾是行不通的(我必须创建一个新变量)

实现这个的正确方法是什么?

抱歉,如果之前有人问过这个问题,我不知道在搜索栏中输入什么来找到类似的答案。

【问题讨论】:

标签: rust


【解决方案1】:

将实际实现移至impl 块。在那里,你确实知道self 的类型。

trait Clean {
    fn clean(&self) -> Self;
}

impl Clean for String {
    fn clean(&self) -> Self {
        // to_owned() to go from &str to String, so you can chain String methods
        self.trim_start_matches("\"").to_owned()
    }
}

【讨论】:

  • 哇,这么简单……应该想到了:)谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2015-01-04
  • 2022-08-16
  • 2011-03-20
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多