- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 rust 的初学者。我不了解 rust 切片和引用之间的区别。 &String和&str有什么区别?我在网上阅读了一些东西,说引用是一个瘦指针,而切片是一个胖指针,但我不知道,似乎也找不到这两个意思。我也知道切片可以强制转换为引用,但是它是如何做到的呢?什么是deref特性?
最佳答案
在Rust中,切片是长度可变的同类数据的连续块。
这是什么意思?
[u8]
是一个切片。在内存中,这是u8
的块。切片本身就是数据。尽管很多时候,人们都将&[u8]
称为切片。 &[u8]
是指向该数据块的指针。该指针包含两件事:指向数据本身的指针和数据的长度。由于它包含两件事,因此称为胖指针。 &u8
也是一个引用(在这种情况下,也可以视为指针 * ),但是我们已经知道,它指向的任何内容都将是一个u8
。因此,它是一个瘦指针,因为它只有一个元素。[u8]
中的所有数据均为u8
类型。[u8]
仅被定义为u8
类型的连续内存块,因此没有关于其大小的编译时间定义。因此,我们需要将其长度存储在指向它的指针中。我们也不能将其放在堆栈上(这意味着:我们不能拥有仅是[u8]
** 的局部变量)。 [T]
是T
的一部分。对于任何给定的T
,只要T
本身是大小合适的 *** 类型,我们就可以想象出[T]
类型。 str
是字符串的一部分。保证它是有效的UTF-8文本,这就是将其与[u8]
分开的所有内容。 Rust可能已经放弃了有效的UTF-8保证,而只是将str
中的其他所有内容定义为[u8]
的一部分。 let my_array: [u32; 3] = [1, 2, 3];
my_array
切片为
[u32]
:
let my_slice: [u32] = my_array[..];
let my_slice: &[u32] = &my_array[..];
my_array
变成
Vec<u8>
,它是堆分配的,并且仍然可以使用。
What is the difference between &String and &str?
&String
是对整个字符串对象的引用。 Rust中的字符串对象本质上是一个
Vec<u8>
。
Vec
包含指向其“包含”数据的指针,因此您的
&String
可以被视为
&&str
。并且,这就是为什么我们可以执行以下任一操作的原因:
let my_string: String = "Abc".to_string();
let my_str: &str = &my_string[..]; // As explained previously
// OR
let my_str: &str = &*my_string;
What is the deref trait?
Deref
特性,是描述取消引用(
*
)运算符的特性。如您在上面看到的,我能够执行
*my_string
。这是因为
String
实现了
Deref
,它允许您取消引用
String
。同样,我可以将
Vec<T>
取消引用到
[T]
中。
Deref
之外,
*
特性还用于更多的地方:
let my_string: String = "Abc".to_string();
let my_str: &str = &my_string;
&T
类型的值分配给
&U
类型的位置,那么Rust将尝试取消引用我的
T
,这与获取
U
所需的次数一样多,同时仍保留至少一个引用。同样,如果我有一个
&&&&....&&&&T
,并且尝试将其分配给
&&&&....&&&&U
,它将仍然有效。
&T
转换为
&U
,其中一定数量的
*T
将产生
U
。
*const T
和*mut T
与引用的大小相同,但被编译器视为不透明。编译器不保证原始指针背后的内容,也不保证它们正确对齐。因此,取消引用是不安全的。但是,由于Deref
特性定义了一种安全的deref
方法,因此取消引用原始指针是很特殊的,并且也不会自动完成。 extern type
。这也包括struct
,它也包含动态大小类型作为其最后一个成员,尽管很难正确构造它们,但是将来随着CoerceUnsized
特性的出现,它会变得更加容易。可以使用extern type
nightly功能使所有这些功能(unsized_locals
除外)都无效,该功能允许使用一些动态大小的局部变量。 T
,如果是T
,则在编译时就知道T: Sized
的大小。如果是T: ?Sized
,则在编译时可能不知道其大小(由于T: ?Sized
接受任何内容,因此它是调用方最灵活的要求)。由于切片需要内部的数据是连续的,并且大小和类型是相同的,因此切片,数组或!Sized
中不能包含动态大小的类型(或Vec<T>
),并且不能维护O(1)
索引。尽管Rust可能会编写特殊的代码来索引到一组动态大小的类型中,但目前还没有。 Box<[T]>
或Rc<[T]>
。这些将自行释放分片(删除时为Box
,而删除了Rc
的所有强引用和弱引用时,则为Rc
(当删除所有强引用时,将调用值的析构函数,但是直到所有弱引用也消失了。))。 关于rust - 我不了解切片和引用(使用rust )之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61151041/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!