2015-11-14 6 views
4

Из документов, то Index черта определяется:Почему метод индекса требует права собственности?

pub trait Index<Idx> where Idx: ?Sized { 
    type Output: ?Sized; 
    fn index(&self, index: Idx) -> &Self::Output; 
} 

Поскольку тип параметра index является Idx, а не &Idx, метод index должен взять на себя ответственность значения, которое он проходит.

Есть ли причина для этого ограничения? Я знаю, что 9 раз из 10 будет использовать что-то вроде целочисленного типа, который выводит Copy, но мне просто интересно, почему заимствованное значение будет менее способным действовать как индекс.

ответ

4

Заимствованное значение может быть очень хорошим индексом, и это позволяет определить свойство Index. Просто используйте ссылку в качестве типа индекса. Ерунда пример:

impl <'a> Index<&'a IndexType> for Foo { 
    type Output = u8; 
    fn index(&self, index: &IndexType) -> &u8 { 
     unimplemented!() 
    } 
} 

Так что «ограничение» прохождения индекса по значению в действительности не является ограничением на всех, потому что это позволяет человеку, реализующий Index выбрать, если индекс должен передаваться по значению или по ссылке ,

+0

D'oh, это имеет смысл. Спасибо, что поняли это. – jobo3208

+0

Если я не ошибаюсь, это именно то, что означает ограничение 'Idx:? Sized', is'nt it? – rodrigo

+0

Планы Rust позволяют передавать динамически размерные типы * по значению * в функции, но это пока невозможно (с точки зрения Rust 1.4.0), поэтому почему ['FnBox'] (https: //doc.rust-lang .org/stable/std/boxed/trait.FnBox.html) существует. Когда это реализовано, 'Idx:? Sized' позволит использовать DST для' Idx'. –

Смежные вопросы