Rust 如何实现与&;一起工作的方法;str,Box<;str>;,Rc<;str>;,等

Rust 如何实现与&;一起工作的方法;str,Box<;str>;,Rc<;str>;,等,rust,Rust,我有以某种方式转换字符串引用的代码,例如,取第一个字母 trait Tr { fn trim_indent(self) -> Self; } impl<'a> Tr for &'a str { fn trim_indent(self) -> Self { &self[..1] // some transformation here } } fn main() { let s = "aaa".trim_in

我有以某种方式转换字符串引用的代码,例如,取第一个字母

trait Tr {
    fn trim_indent(self) -> Self;
}

impl<'a> Tr for &'a str {
    fn trim_indent(self) -> Self {
        &self[..1] // some transformation here
    }
}

fn main() {
    let s = "aaa".trim_indent();
    println!("{}", s);
}
trait Tr{
fn修剪缩进(自)->自;
}
自我暗示{
&self[…1]//这里有一些转换
}
}
fn main(){
设s=“aaa”。修剪缩进();
println!(“{}”,s);
}
现在,我试图将此代码推广到实现
AsRef
的任何特定类型。我的最后一次尝试是

use std::ops::Deref;

trait Tr<'a> {
    fn trim_indent(self) -> Deref<Target = str> + 'a + Sized;
}

impl<'a, T: AsRef<str>> Tr<'a> for T {
    fn trim_indent(self) -> Deref<Target = str> + 'a + Sized {
        self.as_ref()[..1] // some transformation here
    }
}

fn main() {
    let s = "aaa".trim_indent();
    println!("{}", s);
}
使用std::ops::Deref;
T的性状Tr{
fn修剪缩进(自)->Deref+'a+尺寸{
self.as_ref()[…1]//这里有一些转换
}
}
fn main(){
设s=“aaa”。修剪缩进();
println!(“{}”,s);
}

我被卡住了,因为如果没有
Size
我会得到一个编译时类型未知的错误,但是如果没有
Size
我会得到一个无法显式使用标记特征的错误

无论从哪种类型开始,切片
&str
的结束类型始终是
&str
,因此返回类型必须是
&str

然后就是实现类型引用的trait,以便将输入和输出生命期联系在一起:

use std::rc::Rc;

trait Tr<'a> {
    fn trim_indent(self) -> &'a str;
}

impl<'a, T> Tr<'a> for &'a T
where
    T: AsRef<str> + 'a,
{
    fn trim_indent(self) -> &'a str {
        &self.as_ref()[..1] // Take the first **byte**
    }
}

fn main() {
    let s: &str = "aaa";
    println!("{}", s.trim_indent());

    let s: Box<str> = Box::from("bbb");
    println!("{}", s.trim_indent());

    let s: Rc<str> = Rc::from("ccc");
    println!("{}", s.trim_indent());
}
另见:


例如,取第一个字母-Unicode不是这样工作的。请参阅,以讨论这是一个错误的视图。@Shepmaster好的,获取第一个字节,不关心它是什么。谢谢你指出这一点,但这只是一个写得不好的例子。
trait Tr {
    fn trim_indent(&self) -> &str;
}

impl Tr for str {
    fn trim_indent(&self) -> &str {
        &self[..1]
    }
}