Indexing 为什么需要引用索引?

Indexing 为什么需要引用索引?,indexing,rust,slice,Indexing,Rust,Slice,我目前正在学习来自JavaScript的锈迹 我的问题如下: fn main(){ 让name=String::from(“Tom”); 设切片=名称[…2]; println!(“{},{}”,名称,切片); } 这不管用。说“在编译时没有已知的大小” 要解决这个问题,我需要添加和引用操作符 fn main(){ 让name=String::from(“Tom”); 让切片=&名称[…2]; println!(“{},{}”,名称,切片); } 我知道我需要在name之前添加&,并且&是引

我目前正在学习来自JavaScript的锈迹

我的问题如下:

fn main(){
让name=String::from(“Tom”);
设切片=名称[…2];
println!(“{},{}”,名称,切片);
}
这不管用。说
“在编译时没有已知的大小”

要解决这个问题,我需要添加
引用操作符

fn main(){
让name=String::from(“Tom”);
让切片=&名称[…2];
println!(“{},{}”,名称,切片);
}
我知道我需要在name之前添加
&
,并且
&
是引用运算符。但我不知道我为什么要这么做

通过引用变量,引用引用变量
名称
,但不拥有该变量。如果我的引用超出范围,则不会删除原始值。这是否意味着,如果我执行
name[…]
操作,并且该变量被删除,那么该变量将超出范围,因此我需要创建对该变量的引用以防止发生这种情况

谁能给我解释一下吗

我知道我需要在name之前添加
&
,并且
&
是引用运算符。但我不知道我为什么要这么做

我理解这种混淆的来源,因为当您查看它时,它返回
&Self::Output
。那么它已经返回了一个引用,发生了什么


这是因为索引操作符是语法糖,并且使用特征。然而,虽然它使用返回引用的函数,但这并不是它的分解方式

简而言之,
x[i]
不是翻译成
x.index(i)
,而是翻译成
*x.index(i)
,因此引用立即被取消。这就是你如何以
str
而不是
&str
结束的

这就是为什么需要添加
&
以将其“返回”到引用

let foo=&“foo-bar”[…3];//&str
//同
设foo=&*“foo-bar”。索引(…3);//&str
或者,如果您直接调用,那么它当然不会隐式取消引用

使用std::ops::Index;
设foo=“foo bar”。索引(…3);//&str
:

container[index]
实际上是
*container.index(index)


这同样适用于。

@mkrieger1秒作品。我只是想知道
&
到底是什么让我的代码正常工作的,你能把我链接到
索引
方法吗?我在文件里找不到它。它在rust中被称为method,对吗?我已经链接了它,请单击答案中的
index()
中的任意一个。如果您对其中提到的内容感到好奇,请查看文档顶部的okey谢谢,我将详细阅读。从js到生锈就像跳进冷水里。或者冷冻水。不过,谢谢你的解释
let foo = "foo bar"[..3]; // str
// same as
let foo = *"foo bar".index(..3); // str