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
。