- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对指针在Rust中的工作方式有些困惑。有ref
,Box
,&
,*
,我不确定它们如何协同工作。
这是我目前的理解:
Box
并不是真正的指针-这是一种在堆上分配数据并在函数参数中传递大小不一的类型(尤其是特征)的方法。 ref
用于模式匹配,以借用您匹配的内容,而不是获取它。例如,let thing: Option<i32> = Some(4);
match thing {
None => println!("none!"),
Some(ref x) => println!("{}", x), // x is a borrowed thing
}
println!("{}", x + 1); // wouldn't work without the ref since the block would have taken ownership of the data
&
用于借入(借入的指针)。如果我有一个函数fn foo(&self)
,那么我引用的是我自己,该引用将在该函数终止后到期,而不再保留调用者的数据。我还可以通过执行bar(&mydata)
传递要保留所有权的数据。 *
用于制作原始指针:例如let y: i32 = 4; let x = &y as *const i32
。我了解C/C++中的指针,但是不确定如何将它与Rust的类型系统一起使用,以及如何安全地使用它们。我也不确定这种指针的用例是什么。另外,*
符号可用于取消对事物的引用(什么事物,为什么?)。 最佳答案
首先,列出的所有项目实际上都是不同的,即使它们与指针相关。 Box
是库定义的智能指针类型; ref
是用于模式匹配的语法; &
是一个引用运算符,在引用类型中加倍作为标记。 *
是一个取消引用运算符,在原始指针类型中的符号数量增加了一倍。请参阅下面的更多说明。
Rust中有四种基本的指针类型,可以将它们分为两组-引用指针和原始指针:
&T - immutable (shared) reference
&mut T - mutable (exclusive) reference
*const T - immutable raw pointer
*mut T - mutable raw pointer
const
/
mut
的区别主要是 Lint 。原始指针可以自由创建任何对象,例如,还可以凭空凭空创建整数。
unsafe
块来使用。但是,借用的确切内容及其工作方式超出了此答案的范围。
&
运算符创建:
let x: u32 = 12;
let ref1: &u32 = &x;
let raw1: *const u32 = &x;
let ref2: &mut u32 = &mut x;
let raw2: *mut u32 = &mut x;
*
运算符取消引用,尽管对于原始指针来说,它需要一个
unsafe
块:
*ref1; *ref2;
unsafe { *raw1; *raw2; }
.
)会自动引用或取消引用其左参数。因此,例如,如果我们具有以下定义:
struct X { n: u32 };
impl X {
fn method(&self) -> u32 { self.n }
}
method()
通过引用引用了
self
,但
self.n
会自动取消引用它,因此您不必键入
(*self).n
。调用
method()
时也会发生类似的情况:
let x = X { n: 12 };
let n = x.method();
x
中引用
x.method()
,因此您不必编写
(&x).method()
。
&self
语法。在这个示例中,它的意思是
self: &Self
,或更具体地说,是
self: &X
。
&mut self
,
*const self
,
*mut self
也可以使用。
&[u32]
或
*mut SomeTrait
值,则将自动传递相应的内部信息。
Box<T>
是Rust标准库中的智能指针之一。它提供了一种在堆上分配足够的内存以存储相应类型的值的方法,然后用作句柄(指向该内存的指针)。
Box<T>
拥有它所指向的数据;当删除它时,堆上的相应内存将被释放。
Box<T>
等效于
T
,只是它始终占用一定数量的字节,这些字节与您的计算机的指针大小相对应。我们说(拥有的)盒子提供了值(value)语义。在内部,它们使用原始指针来实现,就像几乎所有其他高级抽象一样。
Box
es(实际上,对于几乎所有其他智能指针,例如
Rc
都是如此),也可以借用:您可以从
&T
中获取
Box<T>
。这可以使用
.
运算符自动发生,也可以通过取消引用并再次引用来显式地实现:
let x: Box<u32> = Box::new(12);
let y: &u32 = &*x;
Box
与内置指针相似-您可以使用解引用运算符来获取其内容。这是可能的,因为Rust中的解除引用运算符是可重载的,并且对于大多数(如果不是全部)智能指针类型都已重载。这样可以轻松借用这些指针的内容。
ref
只是模式中的一种语法,用于获取引用类型的变量而不是值。例如:
let x: u32 = 12;
let y = x; // y: u32, a copy of x
let ref z = x; // z: &u32, points to x
let ref mut zz = x; // zz: &mut u32, points to x
let z = &x;
let zz = &mut x;
ref
必不可少的情况下,例如,将引用引入枚举变量中时:
let x: Option<Vec<u32>> = ...;
match x {
Some(ref v) => ...
None => ...
}
x
仅在整个
match
语句内借用,这允许在此
x
之后使用
match
。如果我们这样写:
match x {
Some(v) => ...
None => ...
}
x
将被此
match
占用,并且在此之后将无法使用。
关于pointers - Box,ref和&和*之间的理解和关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65314147/
考虑这样的代码: trait Foo { fn foo(&self); } fn consume_func(b: Box>) { unimplemented!(); } fn prod
考虑这样的代码: trait Foo { fn foo(&self); } fn consume_func(b: Box>) { unimplemented!(); } fn prod
我不明白在 Rust 中,当我们 Box 父结构时,结构中的结构发生了什么。 struct Outer1 { child: Inner1, } struct Inner1 { n: i
我将开始开发一个新网站,并准备处理浏览器用于计算元素宽度和高度的不同方法 (box model stuff)。不知何故,我想到了:如果我只是将 box-sizing 应用于网站中的所有元素会怎么样?
在 java 应用程序中使用 box java sdk 访问 box api 时,我遇到了下面提到的错误。请指出此问题的原因。 Exception in thread "main" com.box.s
计算盒子的宽高时,outline width like outline: 5px dashed red; 如果 box-sizing:border-box,框的宽度/高度是否会考虑轮廓? 最佳答案 我
读完the subtyping chapter of the Nomicon ,我无法理解类型参数的协方差。特别是对于 Box类型,描述为:T is covariant . 但是,如果我写这段代码:
给定这段代码: trait Trait {} struct Child; impl Trait for Child {} struct Father { child: &'a Box, } i
与文件 chooser for dropbox 类似,box.com 有没有? 最佳答案 Box 目前不维护自己的“文件选择器”;然而,有一个很棒的服务叫做 filepicker.io,它充当几乎所有
感谢您对我的问题的回复:Is this a bug of Box API v2 when getting events 这是一个与此相关的新问题。问题是我不能可靠地使用从以前的调用中获得的 next_
我试图让 Box Enterprise API 使用 As-User 工作。我有一个管理员帐户,我用它来尝试检索子帐户中的内容。 我首先使用管理员帐户检索子帐户的用户ID。并将用户 ID 添加为字段“
我想在一个简单的导轨中本地查看我的 Box 帐户中的图像 app .目标是使用这些图像进行幻灯片放映。我寻找必要的参数来传递每个图像相关 url成标签。看来我只能下载图像,或从 Box 应用程序中查看
这个问题在这里已经有了答案: Why doesn't Rust support trait object upcasting? (5 个答案) 关闭 4 年前。 给定代码 trait Base {
所以基本上我尝试从https://github.com/Gor-Ren/gym-jsbsim转换这个自定义健身房环境。使用farama基金会的gymnasium api。这是我正在处理的存储库:htt
我是BOX API的新手,因此正在使用API的v2。我正在从我的应用程序本地进行REST调用。 我想上传一个以前可能上传或未上传的文件。我知道父文件夹ID和文件名。我需要覆盖现有文件,或者至少要再
我已被授予访问(协作)文件夹的权限。我需要的是每天访问该文件夹并从中获取文件。现在我生成的开发者 token 将在 1 小时后过期。有什么办法可以得到authorization code没有第一站,它
我正在尝试将 Box 中上传的文件与另一个外部系统同步。我使用哪些 API 来获取“在给定 dd/mm/yy hh:mm:ss 后上传/更新的所有文件的列表”? 干杯! 最佳答案 我认为User Ev
Vagrant 文档和 CLI 使用术语“box”和“base box”。命名意味着基本框是一种特定类型的框,但是,这些术语似乎被用作同义词。 Vagrant“盒子”和 Vagrant“基础盒子”之间
Box 允许您为文件夹创建标签,但如何从 API 中获取该信息?我在 GET /folders/{id} API 中没有看到标签返回.标签也不被视为元数据。 最佳答案 如果你看看 Fields wri
我正在尝试确定应该使用哪个版本的 Box api。我的决定取决于 v1 api 的 EOL 时间线。我不想完成我的应用程序,就在应用程序发布之前(或之后不久),v1 api 停止工作。 我很乐意使用
我是一名优秀的程序员,十分优秀!