为什么这段代码会抛出错误:
const MSG: &str = "Hello";
fn one_of(_first: &str, _second: &str) -> &str {
MSG
}
我向我的铁杆朋友(gpt-4-1106-preview)问了这个问题,他回答说:
该代码会抛出错误,因为 Rust 无法保证引用的字符串的生存
MSG时间足够长,足以安全地使用函数返回的引用one_of
好吧,好吧,那么为什么这个函数不会导致错误:
const MSG: &str = "Hello";
fn one(_first: &str) -> &str {
MSG
}
我朋友回复:
当声明函数时
one未显式指定返回引用的生存期时,编译器将使用生存期推断并发现返回值MSG具有静态生存期。因此,编译器假定该函数返回具有静态生命周期的引用,并且此推论与输入参数的生命周期兼容(在本例中忽略该参数,因为它不用于确定返回值的生命周期) )。
我的合理反对:
但是在 one_of 的情况下,编译器可以自动为该函数分配静态生命周期,就像在 one 的情况下一样,为什么您所说的有关 one 的所有内容在 one_of 函数的情况下都无效?
我的朋友终于崩溃了,开始为“造成的混乱”道歉,并表示这两个函数不应该导致错误(即使它们没有)。
我们需要生物神经网络的帮助,那就是你,亲爱的皮革和骨头朋友!解释一下主题
当函数返回引用时,编译器必须知道它的生命周期。我们所说的“知道”是指“从函数签名确定引用的生命周期”,而不检查函数体。以节省程序员工作的名义,Rust 提出了隐式推断返回值生命周期的规则:https://doc.rust-lang.ru/book/ch10-03-lifetime-syntax.html#% D0%9F%D1%80%D0 %B0%D0%B2%D0%B8%D0%BB%D0%B0-%D0%BD%D0%B5%D1%8F%D0%B2%D0%BD%D0 %BE%D0%B3%D0% BE-%D0%B2%D1%8B%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F-%D0 %B2%D1%80%D0% B5%D0%BC%D0%B5%D0%BD%D0%B8-%D0%B6%D0%B8%D0%B7%D0%BD%D0%B8。在这种情况下,函数接收两个不同的引用作为输入,编译器不敢确定其中哪个应该绑定到返回引用的生命周期。你需要提示他,例如这样: