Проблема здесь в том, что Vec
владеет Item
s, которые он содержит, но Context.get
пытается вернуть Item
напрямую (и получить его в собственность).
Если Context.get
нужно просто позволить вызывающим взглянуть на содержимое вектора, он должен возвратить ссылку на Item вместо Item:
impl Context {
fn get(&mut self, at: usize) -> &Item {
&self.x[at]
}
}
В приведенном выше случае Context.get
может принятьнеизменная ссылка на self
, поскольку она ничего не меняет.Кроме того, если вы хотите, чтобы вызывающие абоненты Context.get
могли изменять указанный элемент, вы бы вернули &mut Item
вместо &Item
:
impl Context {
fn get(&mut self, at: usize) -> &mut Item {
&mut self.x[at]
}
}
Редактировать: как @apemanzilla любезно отмечает в комментариях,вы также можете сделать так, чтобы Item реализовал черту Clone
, если вы хотите, чтобы Context.get возвращал отдельную копию элемента в at
:
#[derive(Clone)]
struct Item {
value: String,
}
impl Context {
fn get(&mut self, at: usize) -> Item {
self.x[at].clone()
}
Изменение возвращенного элемента не изменит тот, который содержится вself.x хотя;это может или не может быть то, что вы хотели.