У меня возникли проблемы с предоставлением struct переменной-членом, которая является ссылкой на другой тип. Вот моя структура и реализация:.Ссылка на элемент в векторе
struct Player<'a> {
current_cell: &'a Cell,
}
impl<'a> Player<'a> {
pub fn new(starting_cell: &'a Cell) -> Player<'a> {
Player { current_cell: starting_cell }
}
}
Игрок имеет ссылку на текущий Cell
, что они находятся в этом моя Game
структура и ее реализация:
struct Game {
is_running: bool,
cells: Vec<Cell>,
}
impl Game {
pub fn new() -> Game {
let cells = construct_cells();
let player = Player::new(cells[0]);
Game {
is_running: false,
cells: cells,
}
}
}
cells
является вектором Cell
s. Когда я создаю игру, я создаю вектор ячеек в construct_cells()
, а затем запускаю плеер в первой ячейке. Ошибка я получаю:
expected &Cell, found struct `Cell`
Я могу видеть, что я не передавая ссылку, когда я создаю Player
, но если изменить параметр &cells[0]
то орет на меня заимствование всего вектора и затем пытаюсь использовать его снова, когда создаю структуру Game
. Так, что происходит? Как мне просто дать игроку ссылку на Cell
?
У вас есть хорошее представление о том, какие ссылки (или указатели), в частности, что такое * болтающаяся ссылка * (или указатель)? Что произойдет, если вы дадите другу лист бумаги с вашим адресом на нем (123 Main St.), а затем ** вы переехали **?Как будут чувствовать себя новые владельцы дома, если ваш друг только что появился и начал разговаривать с людьми в доме, в котором вы жили, как будто они были вами? – Shepmaster
@Shepmaster Я знаю, какой висячий указатель. Наверное, я просто не понимал, что это решение может позволить это. Как же мне получить тот же результат? Это то, что я пытаюсь сделать возможным? – Dooskington
* Я просто не понимал, что это решение может позволить одно * - и именно поэтому Rust - прекрасный язык, ИМО. Когда вы перемещаете «ячейки» из локальной переменной в структуру «Игра», вы аннулировали любые ссылки в векторе, например, тот, который вы дали «игроку». Языки, такие как C или C++, позволили бы вам это сделать, AFAIK и позволить коду сбой во время выполнения. Трудно сказать, что вы действительно хотите сделать, поскольку «игрок» никогда не используется. – Shepmaster