Rust 为什么索引方法需要所有权?

Rust 为什么索引方法需要所有权?,rust,Rust,从文档中,定义了索引特征: pub trait Index<Idx> where Idx: ?Sized { type Output: ?Sized; fn index(&self, index: Idx) -> &Self::Output; } pub特征索引,其中Idx:?大小{ 类型输出:?尺寸; fn索引(&self,索引:Idx)->&self::输出; } 由于索引参数的类型是Idx,而不是&Idx,因此索引方法需要对传递的值拥有

从文档中,定义了
索引
特征:

pub trait Index<Idx> where Idx: ?Sized {
    type Output: ?Sized;
    fn index(&self, index: Idx) -> &Self::Output;
}
pub特征索引,其中Idx:?大小{
类型输出:?尺寸;
fn索引(&self,索引:Idx)->&self::输出;
}
由于
索引
参数的类型是
Idx
,而不是
&Idx
,因此
索引
方法需要对传递的值拥有所有权


这种限制有什么原因吗?我知道10次中有9次会使用类似整数类型的东西来派生
Copy
,但我只是好奇为什么一个借来的值不能起到索引的作用。

一个借来的值可以是一个非常好的索引,而
索引
特性的定义允许这样做。只需使用引用作为索引类型。例如:

impl <'a> Index<&'a IndexType> for Foo {
    type Output = u8;
    fn index(&self, index: &IndexType) -> &u8 {
        unimplemented!()
    }
}
impl for Foo{
类型输出=u8;
fn索引(&self,索引:&IndexType)->&u8{
未执行!()
}
}

因此,按值传递索引的“限制”实际上并不是一个限制,因为它允许实现
索引的人选择是按值传递索引还是按引用传递索引。

D'oh,这是有道理的。谢谢你澄清这一点。如果我没有弄错的话,这正是限制Idx:?Sized
的意思,不是吗?Rust计划允许通过值将动态大小的类型传递给函数,但这还不可行(从Rust 1.4.0开始),因此为什么存在。当实现此功能时,
Idx:?Sized
将允许DST用于
Idx