String 拆分字符串并返回片段
如何在函数中创建字符串、拆分它并返回其内容?下面的代码失败,因为变量String 拆分字符串并返回片段,string,rust,String,Rust,如何在函数中创建字符串、拆分它并返回其内容?下面的代码失败,因为变量s的生存期在函数f的末尾结束,但返回的Obj持续时间超过该值。我希望将holder移动到Obj将其生命周期与'a联系起来,但这似乎不起作用。有没有其他方法可以做到这一点 struct Obj<'a> { holder : String, p1 : &'a str, p2 : &'a str, p3 : &'a str } fn f<'a>() -&
s
的生存期在函数f
的末尾结束,但返回的Obj
持续时间超过该值。我希望将holder
移动到Obj
将其生命周期与'a
联系起来,但这似乎不起作用。有没有其他方法可以做到这一点
struct Obj<'a> {
holder : String,
p1 : &'a str,
p2 : &'a str,
p3 : &'a str
}
fn f<'a>() -> Obj<'a> {
//let slice = "a,b,c";
let s : String = from_str("a,b,c").unwrap();
let slice = s.as_slice();
let pieces : Vec<&'a str> = slice.split_str(",").collect();
Obj {
holder : s,
p1: pieces[0],
p2: pieces[1],
p3: pieces[2]
}
}
fn main() {
let obj = f();
println!("{}", obj.p2);
}
结构对象{
//让slice=“a,b,c”;
设s:String=from_str(“a,b,c”).unwrap();
设slice=s.as_slice();
let pieces:Vec当你从函数返回某个东西时,你不能“延长”它的生命周期;你就是不能
不过,有几种方法可以重新编写此代码:
Obj
惰性地计算片段。也就是说,您返回一个Obj
,它的方法与f
的方法相同。这样,您就可以将片段的生命周期与&self
的生命周期联系起来(这将是Obj
实例)。在这种情况下,Obj
将不需要'a
参数String
,它拥有自己的内容(从而避免了生命周期问题)。然后,它变成f()->(String,String,String)
s
为参数,允许您将片段的生命周期与之关联。在这种情况下,您将得到f(s:&str)->(&str,&str,&str)
通常,您不能在函数内部创建某个对象,然后返回对该对象的引用。您不能拥有一个
结构体
,该结构体包含一个借用的指针,该指针引用同一结构体的另一个成员。这里有两个解决方法:
- 存储每个子字符串的开始和长度,或每个子字符串的开始和结束。您可以在结构上提供方法来根据需要构造切片
- 存储
String
s(使用转换切片)。您不需要使用此解决方案存储原始字符串,但它会在堆上分配更多内存
阅读我的一篇涉及相关领域的文章时,你可能也会发现它的价值,尽管不是完全相同的东西:不相关,但从字符串文本(或任何&str)中获取字符串的最佳方法是使用“literal.”into_String()
,或很快使用“literal.”to_own()
-您当前使用的_str的过于复杂,会进行许多不必要的检查。