我有一个世界对象:
use rand::{thread_rng, Rng};
use super::world::World;
pub struct Worlds {
worlds: Vec<World>
}
impl Worlds {
pub fn new(world: Vec<World>) -> Worlds {
Worlds { worlds: world }
}
pub fn get_random_world(&self) -> World {
let mut rng = thread_rng();
if self.worlds.len() > 0 {
let world_index: usize = rng.gen_range(0, self.worlds.len());
self.worlds[world_index]
}
self.worlds[0]
}
}
结构Worlds
采用名为World
的结构向量(如果需要,我可以发布该代码)。
get_random_world
应该返回World
结构,并且与self.worlds[world_index]
一致,但显然它需要()
。
|
20 | self.worlds[world_index]
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected (), found struct `game::world::world::World`
|
= note: expected type `()`
= note: found type `game::world::world::World`
我不知道此时该怎么做。
答案 0 :(得分:4)
您的if
区块没有返回任何内容..流量将通过此处显示:
if self.worlds.len() > 0 {
let world_index: usize = rng.gen_range(0, self.worlds.len());
self.worlds[world_index]
} // <--- ... this drops down
self.worlds[0]
以下是您问题的简单复制:Playground link
有两种方法可以解决这个问题。首先,您可以显式返回条件(View it on the playground):
if self.worlds.len() > 0 {
let world_index: usize = rng.gen_range(0, self.worlds.len());
return self.worlds[world_index]; // Explicitly return out of here
}
self.worlds[0]
更多&#34;惯用&#34;方法我想添加一个else
块,以便条件求值的值实际上是函数返回的值(View it on the playground):
if self.worlds.len() > 0 {
let world_index: usize = rng.gen_range(0, self.worlds.len());
self.worlds[world_index]
} else {
self.worlds[0]
}
现在,无论代码采用什么逻辑分支,结果的表达式都将从函数返回。