期望()但发现了一个结构

时间:2016-10-17 00:11:32

标签: rust

我有一个世界对象:

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`

我不知道此时该怎么做。

1 个答案:

答案 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]
}

现在,无论代码采用什么逻辑分支,结果的表达式都将从函数返回。