为什么我不能像trim_right_matches()中那样在trim_matches()中使用&str?

blz*_*blz 2 string pattern-matching rust

trim_right_matches我可以传递一个字符串值:

println!("{}", "[(foo)]".trim_right_matches(")]"));
// [(foo
Run Code Online (Sandbox Code Playgroud)

但是,我不能在trim_matches以下字符串中使用字符串值:

println!("{}", "[(foo)]".trim_matches("[()]"));
Run Code Online (Sandbox Code Playgroud)

因为我收到以下错误:

error[E0277]: the trait bound `std::str::pattern::StrSearcher<'_, '_>: std::str::pattern::DoubleEndedSearcher<'_>` is not satisfied
 --> test.rs:2:27
  |
2 |     println!("{}", "[(foo)]".trim_matches("[()]"));
  |                              ^^^^^^^^^^^^ the trait `std::str::pattern::DoubleEndedSearcher<'_>` is not implemented for `std::str::pattern::StrSearcher<'_, '_>`
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)

以下代码有效:

println!("{}", "[(foo)]".trim_matches(&['(', '[', ']', ')'] as &[_]));
// foo
Run Code Online (Sandbox Code Playgroud)

但是,它很长并且不像单个字符串值那样容易阅读; 我希望能够使用类似的字符串值trim_right_matches.

lje*_*drz 5

这两个函数具有相似的签名,但如果你仔细观察,你会发现它们的搜索模式实际上是不同的:

trim_right_matches:

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str
where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a> // ReverseSearcher
Run Code Online (Sandbox Code Playgroud)

trim_matches:

pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str
where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a> // DoubleEndedSearcher
Run Code Online (Sandbox Code Playgroud)

文档中DoubleEndedSearcher你可以找到解释为什么&str不能成为DoubleEndedSearcher:

(&str)::Searcher不是DoubleEndedSearcher因为"aa" 大海捞针"aaa"中的模式匹配为"[aa]a"或者"a[aa]",取决于搜索的哪一方.

至于为什么你的解决方法有效:

"[(foo)]".trim_matches(&['(', '[', ']', ')'] as &[_]));
Run Code Online (Sandbox Code Playgroud)

这是因为它实际上不匹配a &str,而是on &[char],它不是字符串切片而是一个字符数组的切片,这是有效的DoubleEndedSearcher.


Seb*_*edl 5

第一部分代码并没有按照你的想法去做。它")]"从末尾精确地修剪字符串,但它不会修改字符串"([foo])"。换句话说,将字符串传递给修剪函数意味着“完全修剪此字符串”,而不是“修剪此字符串中出现的所有字符”。未编译的代码不会执行您想要的操作,因为它只会修剪掉确切的 string "[()]",而这不会出现在您的示例中。

传递一个字符数组,而不是单独修剪所有字符,无论顺序如何。

所以你想要字符数组,即使传递一个字符串看起来更方便。

至于你写的代码为什么编译不出来,ljedrz回答了那部分。