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 获取`&';比`字符串中的当前函数具有更长生存期的str``_String_Rust_Lifetime - Fatal编程技术网

String 获取`&';比`字符串中的当前函数具有更长生存期的str``

String 获取`&';比`字符串中的当前函数具有更长生存期的str``,string,rust,lifetime,String,Rust,Lifetime,在一个返回和'astr的函数中,我创建了一个字符串。 我想返回一个与此字符串内容相同的&'a str fn给定字符串(A:&str)->String{ String::from(“示例”) } 发布结构{ pub fn from_String_A(A:&'A str)->结果{ let processed_String=givesString(&A); let processed_str:&'a str=a_processed_String.as_str(); 好(自我){ strField:已

在一个返回
和'astr
的函数中,我创建了一个
字符串。
我想返回一个与此
字符串
内容相同的
&'a str

fn给定字符串(A:&str)->String{
String::from(“示例”)
}
发布结构{
pub fn from_String_A(A:&'A str)->结果{
let processed_String=givesString(&A);
let processed_str:&'a str=a_processed_String.as_str();
好(自我){
strField:已处理的,
})
}
}

它不会编译:一个经过处理的字符串的
借来的值活得不够长,因为它被丢弃在函数的末尾

我知道无论发生什么情况,
字符串
都将被删除

但是现在,如果我创建一个
&'a str
并将其传递到返回值中,它编译时不会出现问题:

fn给定字符串(A:&str)->String{
String::from(“示例”)
}
发布结构{
pub fn from_String_A(A:&'A str)->结果{
let longlife:&'a str=“从本fn外部向您问好”;
好(自我){
斯特菲尔德:长寿,
})
}
}

那么,是否有可能创建一个新的
&'a str
,它不是从将要删除的
字符串
中借用,而是指向某个具有生存期的
'a
内存,该内存与
字符串
内容相同?


有无数类似的问题,答案是只返回一个
字符串
,但假设我不能触摸
givesString
的代码或结构
s
,这取决于您需要尝试的程度

在第二个示例中,
longlife
是一个文本
&'static str
。由于无论
'a
是什么,静态
'a
的寿命至少与任何
'a
的寿命相同,因此通过
s
将其分配给返回值是有效的。但是,在一般情况下,这不是很有用,因为出于明显的原因,您无法修改
&'static str

我强烈建议重新构造代码,以便有一个所有者,
S
似乎是一个候选


您可以通过
std::mem::forget
:创建
字符串
,忘记它并手动从中派生一个强制的
&'static str
。这很简单,意味着您泄漏了所分配字符串的内存,使其至少与任何
'a
一样长时间有效。大多数人会认为这只是一个bug,或者至少是一个丑陋丑陋的黑客。但是这是可能的。

“我试图让一个函数从函数内部创建的字符串返回一个&'a str:”那么字符串将位于何处?你不能用我所知道的任何语言返回本地值。字符串将不存在。我只对创建一个具有相同内容的
&'a str
感兴趣,或者创建第一个苹果的长寿克隆,扔掉第一个苹果,然后给人们第二个。是的,我们称之为苹果,所以在这个上下文中,有一件有用的事情需要记住:生命是描述性的,而不是规定性的。除了永久存在的
static
s之外,你不能声明你想要一个特定的对象有一个特定的生存期。”在第二个例子中,longlife是一个字面的&“static str”。不完全是,longlife有一个
'a
生存期,但是在这行中被分配给一个静态str,longlife仍然没有一个静态生存期。“这很简单,意味着您泄漏了所分配字符串的内存,使其至少与任何'a'一样长时间存在“泄漏就是泄漏,它将和程序一样长。在真正的代码中,我肯定会将
strField
更改为
字符串
。在其他问题中,答案建议返回字符串,这与创建
和'a str
不同。所以我仍然很好奇,这是不可能的,还是在其他问题的情况下不推荐这样做。我也没有想到长寿命是静态的,所以谢谢。顺便说一句,像
长寿命
那样每次创建一个
和一个静态
会重复使用相同的内存,并且不会随着时间的推移泄漏更多?Stargateur正确地认为
长寿命
是一个
和一个str
,它会分配一个
和一个静态str
。同样的论点也适用:因为
'static
比任何
'a
都有效,所以赋值总是合理的。像
let longlife=“foobar”
这样的文字将始终重复使用相同的内存,并且不会随时间泄漏。文本被烘焙到可执行文件中,因此,最初甚至没有在堆上分配