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());
}
另见:
trait Tr {
fn trim_indent(&self) -> &str;
}
impl Tr for str {
fn trim_indent(&self) -> &str {
&self[..1]
}
}