我在Rust中制作了一个Tic-Tac-Toe游戏,作为一个初学者项目,当我遇到这个问题时,我正在计算游戏的状态(获胜、抽签等).我首先编写了以下代码:
fn status(&self) -> Status {
if Board::has_won(self.x_board) {
Status::Won(true)
} else if Board::has_won(self.o_board) {
Status::Won(false)
} else if self.is_full() {
Status::Draw
} else {
Status::None
}
}
然后我修改了它,以返回一个引用:
fn status(&self) -> &Status {
if Board::has_won(self.x_board) {
&Status::Won(true)
} else if Board::has_won(self.o_board) {
&Status::Won(false)
} else if self.is_full() {
&Status::Draw
} else {
&Status::None
}
}
我这样做是为了将self的生存期和返回值链接在一起,以便如果板的状态更改,则不能再使用对Status的引用.
然后我try 了这个代码:
fn status(&self) -> &Status {
let status;
if Board::has_won(self.x_board) {
status = Status::Won(true)
} else if Board::has_won(self.o_board) {
status = Status::Won(false)
} else if self.is_full() {
status = Status::Draw
} else {
status = Status::None
}
&status
}
这会导致编译器错误,说明它无法返回对所拥有数据的引用.为什么第一个代码片段没有这个问题?