Rust中为子Trait实现IndexMut时能否复用超Trait的Index实现
答案
可以实现,不需要显式为dyn IndexableMut单独编写Index<usize>的实现。
原理说明:
IndexMuttrait 本身要求实现者必须先实现Indextrait,但是你可以通过调整原有Index实现的作用范围,让dyn IndexableMut自动获得Index的实现。- 你原本的
Index实现仅作用于dyn Indexable这一种trait对象类型,而dyn IndexableMut是另一种独立的trait对象,不会自动继承这个实现。只要把原有Index的实现改成泛型形式,覆盖所有实现了Indexabletrait的未定长类型,所有满足Indexable约束的类型(包括dyn IndexableMut,因为IndexableMut继承自Indexable)就都会自动获得Index的实现。 - 额外提醒:你示例中
IndexMut的方法名写错了,应该是index_mut而非index。
可正常编译的完整代码示例:
use std::ops::{Index, IndexMut}; trait Indexable { fn get(&self, index: usize) -> &bool; } trait IndexableMut: Indexable { fn get_mut(&mut self, index: usize) -> &mut bool; } // 调整原有Index实现的作用范围 impl<T: Indexable + ?Sized> Index<usize> for T { type Output = bool; fn index(&self, index: usize) -> &Self::Output { self.get(index) } } // 直接实现IndexMut即可,不需要额外给dyn IndexableMut写Index实现 impl IndexMut<usize> for dyn IndexableMut { fn index_mut(&mut self, index: usize) -> &mut Self::Output { self.get_mut(index) } }
内容的提问来源于stack exchange,提问作者DemosKadi
相关产品推荐
相关产品推荐

