2016-10-17 4 views
-2

У меня есть объект мира:Ожидаемое(), но нашел-структуру

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` 

Я не уверен, что делать в этот момент.

+2

Дубликат http://stackoverflow.com/q/24579756/155423; http://stackoverflow.com/q/37554325/155423; http://stackoverflow.com/q/24502282/155423; http://stackoverflow.com/q/39522242/155423 и, возможно, другие. – Shepmaster

+1

Если 'self.worlds.len()> 0' is * not * true, длина равна 0, а индексирование в 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] 

Чем больше «идиоматическое» подход, я думаю, было бы добавить 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] 
} 

Теперь, независимо от того, что логической ветви коды принимает выражение, что результаты будут возвращены из функции.

+0

Ах, это имеет смысл. Я думал, что без ключевого слова «return», ржавчина знала бы: «Хорошо, он не использует'; 'поэтому он должен захотеть вернуться» Спасибо :) – TheWebs

+1

Вы правы ... кроме того, что он не предполагает «так он должен захотеть вернуться из функции ». Все это выражение в Rust - все возвращает значение. Ваш 'if' conditional здесь означает, что Rust предполагает« хочет вернуть »значение. Он не привязан ни к чему, и поэтому Rust ожидает, что он вернет единицу (которая является '()' .. ничего). Вместо этого ваш условный результат вычисляется на экземпляр «World»: следовательно, ошибка. –

Смежные вопросы