刚刚读完《铁锈书》中关于生命的章节。
所有的东西都是有意义的,特别是一个主要的例子是下面的不会编译
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let string1 = String::from("long string is long");
let result;
{
let string2 = String::from("xyz");
result = longest(string1.as_str(), string2.as_str());
}
println!("The longest string is {}", result);
}
这是因为“我们告诉Rust,最长函数返回的引用的生存期与传入的引用的生存期中的较小者相同。因此,借用检查器不允许清单10-24中的代码具有无效引用。”在本章的另一部分中,“最长函数返回的引用的生存期与传入的引用的生存期中较小者相同。”
因此,很自然地,我会尝试给出我自己的简化示例,如下所示
fn foo<'a>(x: &'a str) -> &'a str {
x
}
fn main() {
let y;
{
let x = "hello";
y = foo(x);
}
println!("y: {}", y);
}
令我惊讶的是,这个编译和运行都很好。怎样当引用x超出范围时,引用y是否应该终止其生存期?
之所以这样做,是因为“hello”有一个静态生存期,x只是对该静态字符串的引用。x本身可以超出范围,它引用的资源有一个静态生命周期,因此生命周期足够长,可以容纳y。
如果我们改为让
x
指向std::String
,我们会得到您期望的错误:
fn foo<'a>(x: &'a str) -> &'a str {
x
}
fn main() {
let y;
{
let x = String::from("hello");
y = foo(&x);
}
println!("y: {}", y);
}
error[E0597]: `x` does not live long enough
--> src/main.rs:10:17
|
10 | y = foo(&x);
| ^^ borrowed value does not live long enough
11 | }
| - `x` dropped here while still borrowed
12 | println!("y: {}", y);
| - borrow later used here
我有一个问题与生命周期参数的结构。我不能100%确定如何描述这个问题,但是我创建了一个显示编译时错误的简单案例。 我得到的错误是 我尝试了很多变体,只是无法编译这个东西。我在这里找到了另一个帖子(如何修复:预期的具体寿命,但找到了绑定的寿命参数),但似乎绕过了问题,而不是解决它。我真的不明白为什么这个问题会出现。该 有什么想法吗?谢谢你的帮助。
我已经在锈菌上试验了很长时间了。关于铁锈的寿命有一种混淆。查看以下代码: string2的生存期在内部作用域之后结束,结果在外部作用域中定义。在println!中传递结果时!,编译不会抱怨,而是继续并打印结果。但是,当我将string2更改为: 借书人会投诉的。为什么会这样。
此代码基于生存期章节中Rust书中的示例代码。我想知道相同方法的以下两个版本有何不同: 对 我猜在第一个版本中,我们指示编译器 > 查找生存期,使两者都 确保返回的引用仅在该生命周期内使用,因为在该生命周期之外,它可能会成为悬空引用。 代码的第二个版本是做什么的?Rust书中的生命周期省略规则之一说,在结构方法中,返回的引用被分配了
我从未使用过ElasticSearch,现在我不得不用它来测试一些应用程序。有人能给我解释一下它是如何工作的吗?举个例子,创建一个索引,几个带字段的类型,这对我很有帮助。给我一个基于此的示例(索引learnDb,键入users/roles,fields-firstName/lastName。谢谢,祝你度过愉快的一天!
我正在Rust中创建一个无闩锁并发哈希映射。吞吐量曲线看起来就像我预期的那样,最多可达16个线程,此时性能将下降。 吞吐量(MOps/秒)与线程数 我使用了一个带有48个vCPU和200GB RAM的Google云实例。我尝试启用/禁用超线程,但没有明显的效果。 以下是我如何生成线程: 我没有主意了;我的Rust代码对于多线程是否正确?
本文向大家介绍一个处理用户登陆的servlet简单实例,包括了一个处理用户登陆的servlet简单实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了一个处理用户登陆的servlet实现方法。分享给大家供大家参考。具体分析如下: Login.java代码如下: LoginCl.java代码如下: 其实上面这个处理用户名密码带有明显注入漏洞,可以根据用户名从数据库取密码,用取出的密码和用户输