- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#[derive(Debug)]
struct Foo<'a> {
x: &'a i32,
}
impl<'a> Foo<'a> {
fn set(&mut self, r: &'a i32) {
self.x = r;
}
}
fn main() {
let v = 5;
let w = 7;
let mut f = Foo { x: &v };
println!("f is {:?}", f);
f.set(&w);
println!("now f is {:?}", f);
}
我的理解是,在第一次借用v
的值时,struct声明上的泛型生命周期参数'a
填入了该值的生命周期v
。这意味着生成的 Foo
对象的生命周期不得超过此 'a
的生命周期,或者 v
的值必须至少与此生命周期一样长Foo
对象。
在方法set
的调用中,使用了impl
block 上的生命周期参数,w
的值的生命周期为在方法签名中填写 for 'a
。 &mut self
被编译器分配了不同的生命周期,即 f
(Foo
对象)的生命周期。如果我在 main
函数中切换 w
和 f
的绑定(bind)顺序,这将导致错误。
我想知道如果我在 中使用与
方法:r
相同的生命周期参数 'a
注释 &mut self
引用会发生什么设置
impl<'a> Foo<'a> {
fn set(&'a mut self, r: &'a i32) {
self.x = r;
}
}
这会导致以下错误:
error[E0502]: cannot borrow `f` as immutable because it is also borrowed as mutable
--> src/main.rs:21:31
|
19 | f.set(&w);
| - mutable borrow occurs here
20 |
21 | println!("now f is {:?}", f);
| ^ immutable borrow occurs here
22 | }
| - mutable borrow ends here
与上面的例子相反,f
在第二个 println! 时仍然被认为是可变借用的。被调用,所以它不能作为不可变的同时被借用。
这是怎么发生的?
通过不遗漏生命周期注释,编译器为我在第一个示例中为 &mut self
填充了一个。这是根据生命周期省略规则发生的。但是,在第二个示例中,通过将其显式设置为 'a
,我将 f
的值和 w
的值的生命周期联系起来。
f
是否以某种方式被认为是借用的?
如果是这样,借用的范围是什么?是 min(lifetime of f
, lifetime of w
) -> lifetime of f
?
我假设我还没有完全理解函数调用中的 &mut self
引用。我的意思是,函数返回了,但是 f
仍然被认为是借用的。
我正试图完全理解生命周期。我主要是在寻找有关我对这些概念的理解的纠正反馈。我非常感谢您的每一个建议和进一步的说明。
最佳答案
In the call to the method
set
the lifetime parameter on the impl block is used and the lifetime of the value ofw
is filled in for'a
in the method signature.
没有。生命周期参数 'a
的值在 Foo
结构的创建时固定,并且永远不会改变,因为它是其类型的一部分。
在您的情况下,编译器实际上为 'a
选择了一个与 v
和 w
的生命周期兼容的值。如果那不可能,它将失败,例如在这个例子中:
fn main() {
let v = 5;
let mut f = Foo { x: &v };
println!("f is {:?}", f);
let w = 7;
f.set(&w);
println!("now f is {:?}", f);
}
哪些输出:
error[E0597]: `w` does not live long enough
--> src/main.rs:21:1
|
18 | f.set(&w);
| - borrow occurs here
...
21 | }
| ^ `w` dropped here while still borrowed
|
= note: values in a scope are dropped in the opposite order they are created
正是因为 v
强加的 'a
生命周期与 w
的较短生命周期不兼容。
在第二个示例中,通过强制 self
的生命周期也为 'a
,您将可变借用绑定(bind)到生命周期 'a
也是如此,因此当生命周期 'a
的所有项目都超出范围时,借用结束,即 v
和 w
。
关于rust - 链接 self 的生命周期和方法中的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30273850/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!