Mam problem z nadawaniem struct zmiennej składowej, która jest referencją do innego typu. Oto moja struktura i realizacja:.Odwołanie do elementu w wektorze
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 }
}
}
Zawodnik ma odniesienie do aktualnej Cell
że są tu jest mój Game
struct i jego realizacja:
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
jest wektorem Cell
s. Kiedy tworzę grę, tworzę wektor komórek w construct_cells()
, a następnie uruchomię odtwarzacz w pierwszej komórce. Błąd otrzymuję to:
expected &Cell, found struct `Cell`
widzę, że nie jestem przekazując odwołanie kiedy utworzyć Player
, ale jeśli mogę zmienić parametr &cells[0]
to krzyczy na mnie za wypożyczenie całego wektora i następnie próbuję użyć go ponownie podczas tworzenia struktury Game
. Więc co się dzieje? Jak mogę podać odtwarzaczowi odniesienie do Cell
?
Czy dobrze rozumiesz, jakie są referencje (lub wskaźniki), a konkretnie: * zwisające odwołanie * (lub wskaźnik)? Co by się stało, gdybyś dała przyjacielowi kartkę z adresem na niej (123 Main St.), a następnie ** przeniosłeś **?Jak czuliby się nowi właściciele domu, gdyby twój przyjaciel po prostu się pojawił i zaczął rozmawiać z ludźmi w domu, w którym mieszkałeś, jakbyś był tobą? – Shepmaster
@Shepmaster Wiem, czym jest zwisający wskaźnik. Chyba po prostu nie zdawałem sobie sprawy, że to rozwiązanie może na to pozwolić. Jak zatem uzyskać ten sam wynik? Czy to, co próbuję zrobić, jest możliwe? – Dooskington
* Po prostu nie zdawałem sobie sprawy, że to rozwiązanie może pozwolić na jedno * - i dlatego Rust jest cudownym językiem, IMO. Kiedy przenosisz "komórki" z zmiennej lokalnej do struktury "Game", unieważniłeś wszelkie odniesienia do wektora, takie jak te, które dałeś "graczowi". Języki takie jak C lub C++ pozwolą ci na to, AFAIK, i pozwolą na awarię kodu w czasie wykonywania. Trudno powiedzieć, co naprawdę chcesz zrobić, ponieważ 'player' nigdy nie jest używany. – Shepmaster