Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 拆分字符串并返回片段_String_Rust - Fatal编程技术网

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的
    过于复杂,会进行许多不必要的检查。