Indexing 为什么需要引用索引?
我目前正在学习来自JavaScript的锈迹 我的问题如下: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之前添加&,并且&是引
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