我一直在努力寻找 Rust 生命周期的一个很好的解释。我的想法是,它们是我们告诉编译器哪些变量必须比哪些变量寿命更长的方式,因此它可以验证引用是非悬空的,而不必检查每个代码路径。我不明白的是我们在使用它们时实际上在说什么。举个例子:
fn foo<'a>(bar: &'a i32, baz: &'a i32) -> &'a i32 {
bar
}
fn main() {
let m = 5;
let x = &m;
{
let n = 6;
let y = &n;
{
let z = foo(x, y);
dbg!(z);
}
dbg!(y);
}
dbg!(x);
}
Run Code Online (Sandbox Code Playgroud)
这编译并运行良好。在这里x
,y
, 和z
都活了不同的时间长度。基础数据m
和n
也存在不同的时间。很明显,当我们声明参数和foo
to 的返回值都具有生命周期时'a
,我们并不是说它们都在程序的完全相同的一段时间内生存。(我尽量不说“一生”,抱歉措辞尴尬。)
我听到的另一种解释是我们说在 、 和返回值的生命周期的交点处存在一些生命周期'a
。然而,这将是一个微不足道的声明,因为显然它们都在我们调用时的范围内。bar
baz
foo
在我看来,我们所说的是,存在某种生命周期,'a
使得bar
和baz
超过 …
为什么当我运行 C++ 程序时会打开一个终端窗口,以及如何std::cout
知道它应该打印到该终端?
我觉得这段代码应该可以工作,因为在大多数情况下Box<Dog>
s 应该能够隐式转换为s:Box<dyn Animal>
struct Dog {}
trait Animal {}
impl Animal for Dog {}
fn main() {
let _: Vec<Box<dyn Animal>> = [Dog {}, Dog {}]
.into_iter()
.map(Box::new)
.collect();
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下编译器错误:
error[E0277]: a value of type `Vec<Box<dyn Animal>>` cannot be built from an iterator over elements of type `Box<Dog>`
--> src/main.rs:9:10
|
9 | .collect();
| ^^^^^^^ value of type `Vec<Box<dyn Animal>>` cannot be built from `std::iter::Iterator<Item=Box<Dog>>`
|
= help: the trait `FromIterator<Box<Dog>>` is not implemented for …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的程序中使用Array.Fill
,但收到一条错误消息,指出没有Fill
. 我在这篇文章的标题中省略了函数名称,因为Array
. 我在网上发现了多个论坛帖子,人们有同样的问题,对他们来说,解决方案是添加using System;
或using System.Linq;
,但我已经有了这两个。我怀疑问题是我需要以某种方式添加System.Runtime.dll
包含 定义的程序集Array.Fill
,但我将 Unity 与 Visual Studio for Mac 一起使用,并且我无法找到在任一程序中管理程序集的方法。我也无法在任何地方找到项目或解决方案文件(我相信这就是我要添加程序集的地方)。这是问题线:
Array.Fill<Vector4>(cross, Rot4.Cross(vs[0], vs[1], vs[2]));
Run Code Online (Sandbox Code Playgroud)
有谁知道我可以尝试什么?我想我可以手动填充数组,但我想知道为什么这不起作用。