我在Rust中有以下代码:
fn send_message(_: &[u8]) {}
let args: Vec<String> = std::env::args().collect();
let string_message = args[1..].join(" ") + "\nEND\n";
let socket_message = string_message.as_bytes();
send_message(&socket_message);这个很管用。但是,我希望避免在那里使用string_message变量,所以我只是在socket_message的声明中内联了这个表达式:
let args: Vec<String> = env::args().collect();
let socket_message = (args[1..].join(" ") + "\nEND\n").as_bytes();
send_message(&socket_message);铁锈并不认为这两个片段是相同的,尽管!
它给出了这个错误:
error: borrowed value does not live long enough
--> <anon>:7:70
|
7 | let socket_message = (args[1..].join(" ") + "\nEND\n").as_bytes();
| --------------------------------- ^ temporary value dropped here while still borrowed
| |
| temporary value created here
...
10 | }
| - temporary value needs to live until here
|
= note: consider using a `let` binding to increase its lifetime我相信我遗漏了一些与借阅检查程序有关的东西,但我甚至无法理解它可能是什么,因为我期望一个临时的值,即使没有直接分配,也不会与借款有任何关系?!
发布于 2017-04-29 10:40:12
正如编译器告诉您的那样:
= note: consider using a `let` binding to increase its lifetime..。let绑定可以增加值的生存期。表达式args[1..].join(" ") + "\nEND\n"创建一个类型为String的值。在语句中创建的值不会超过该语句,除非它们被命名(带有let绑定)或是rvalue promoted。后一种情况在这里不适用,而且由于您没有命名您的值,所以它不会超过父语句。通常情况下,这并不是真正的问题,但是如果您想稍后引用指定的值,则会引用一些死掉的值。因此,借阅者就会抱怨。
在您的例子中,有两种可能性--
let绑定来增加值的生存期,就像在第一个示例中所做的那样。您仍然可以缩短代码一行,如下所示:
设args: Vec = env::args().collect();string_message = args1...join(“") + "\nEND\n";send_message(string_message.as_bytes());https://stackoverflow.com/questions/43694366
复制相似问题