当我想返回一个对象时,我只是指定它,但是当创建的对象基于字符串的引用时我该怎么办?我的例子:
fn init_keychain() -> keyring::Keyring<'a> {
// Gets the username of the current user to save it in the right keychain
let mut username = Command::new("whoami")
.output()
.expect("Failed to get current user");
// Check for newline sequence in Command Output and strip it
if username.stdout[username.stdout.len()-1] == 10 {
username.stdout.pop();
}
let user = String::from_utf8_lossy(&username.stdout);
// Create a new Keychain attribute to save the passord to
keyring::Keyring::new("Service", &user.into_owned())
}
引发了错误:
error: borrowed value does not live long enough
--> controller.rs:44:44
|
44 | keyring::Keyring::new("Service", &user.into_owned())
| ^^^^^^^^^^^^^^^ does
not live long enough
...
49 | }
| - temporary value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on
the body at 30:29...
我理解错误发生的原因 - &user
一旦init_keychain()
结束,参考&str
就会超出范围。
如何在需要into_owned()
的位置创建一个对象,然后将其返回?我完全错过了一些生锈的魔法吗?我尝试使用clone()
和/boot/config-*
,但这并未改变用户的生命周期。这就是我的知识结束的地方。
我对Rust的所有权概念感到困惑,我无法在docs,Google或Stack Overflow中找到信息。但也许我真的很难搞清楚这一点。