Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Indexing 切片索引在锈蚀中是如何工作的?_Indexing_Rust - Fatal编程技术网

Indexing 切片索引在锈蚀中是如何工作的?

Indexing 切片索引在锈蚀中是如何工作的?,indexing,rust,Indexing,Rust,我想知道生锈的是什么切片。事实证明,它只是一个包含数据指针和大小的结构。我已经查看了索引的源代码,我已经: impl-ops::索引为[T]{ 类型输出=T; fn索引(&self,索引:usize)->&T{ //NB内置索引 &(*自我)[索引] } } 我不是铁锈专家,但就我所知,&(*self)似乎是我的一个指针,在铁锈中没有指针索引。那么这个索引是如何工作的呢?它只是一个内置的编译器吗 它只是一个内置的编译器吗 对。源代码注释也这么说[T]是一种未调整大小的类型,无论如何都需要一些额

我想知道生锈的是什么切片。事实证明,它只是一个包含数据指针和大小的结构。我已经查看了索引的源代码,我已经:

impl-ops::索引为[T]{
类型输出=T;
fn索引(&self,索引:usize)->&T{
//NB内置索引
&(*自我)[索引]
}
}
我不是铁锈专家,但就我所知,
&(*self)
似乎是我的一个指针,在铁锈中没有指针索引。那么这个索引是如何工作的呢?它只是一个内置的编译器吗

它只是一个内置的编译器吗

对。源代码注释也这么说
[T]
是一种未调整大小的类型,无论如何都需要一些额外的规则。例如,没有大小的类型不能存在于堆栈上(很难处理)。但对非大小类型的引用由指针和大小组成(特别是“完成类型的内容”)


但是请注意,表达式的计算方式如下:
&(*self)[index])
。这意味着
self
(type
&[T]
)被解引用为type
[T]
,然后被索引。这将返回一个
T
,但我们只需要一个对它的引用,因此
&

@LukasKalbertodt抱歉,已编辑!老实说,我一直觉得这种按值返回并添加
&
的索引方法很奇怪。我的直觉尖叫:为什么要提到一个临时的呢?@MatthieuM。索引生成一个左值,它与临时(右值)@Kha:非常遗憾,这不是错误消息所说的:,因此是一个(新的)值。我知道事实并非如此,但我发现这确实令人困惑。(也许这只是一个案例,改善诊断将大大有助于澄清问题)。@MatthieuM“返回”确实会让人困惑。。。但它没有这么说
v[0]
是类型为
String
的(非临时l-)值,这是完全正确的。我不确定该如何改进这个信息。@Kha:我也不确定。只是,新值和从解除隔离中获得的“值”之间的差异可能不一致,因为在后者上,您可以通过应用
&
来“返回”到原始引用,而在前者上,应用
&
通常不起作用(由于使用寿命)除非编译器决定提供帮助并延长基础值的生存期。这是初学者的剪纸,我不知道如何使它平滑。
impl<T> ops::Index<usize> for [T] {
    type Output = T;

    fn index(&self, index: usize) -> &T {
        // NB built-in indexing
        &(*self)[index]
    }
}