2016-10-17 1 views
-2

ich eine Welt zum Gegenstand haben:Erwartet() fand aber eine Struktur

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

Die Struktur Worlds einen Vektor von Strukturen genannt nimmt World (ich kann diesen Code schreiben, wenn Sie es brauchen).

get_random_world soll eine World Struktur zurückgeben, und tut dies mit self.worlds[world_index], aber anscheinend erwartet es eine ().

Ich bin verloren; Ich habe ihm gesagt, was ich zurückgeben soll, es kommt zurück, aber es erwartet etwas anderes?

| 
20 |    self.worlds[world_index] 
    |    ^^^^^^^^^^^^^^^^^^^^^^^^ expected(), found struct `game::world::world::World` 
    | 
    = note: expected type `()` 
    = note: found type `game::world::world::World` 

Ich bin mir nicht sicher, was ich zu diesem Zeitpunkt tun soll.

+2

Duplizieren von http://stackoverflow.com/q/24579756/155423; http://stackoverflow.com/q/37554325/155423; http://stackoverflow.com/q/24502282/155423; http://stackoverflow.com/q/39522242/155423 und wahrscheinlich andere. – Shepmaster

+1

Wenn 'self.worlds.len()> 0 '* nicht * wahr ist, ist die Länge 0 und die Indexierung bei 0 wird in Panik versetzt. Vielleicht möchten Sie eine 'Option ' zurückgeben. –

Antwort

4

Ihr if Block kehrt nicht alles .. Fluss durch hier fallen:

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] 

Hier ist eine einfache Reproduktion Ihrer Ausgabe: Playground link

Es gibt zwei Möglichkeiten, wie Sie dieses Problem beheben können. Erstens können Sie explizit in der bedingten Rück (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] 

Je mehr „idiomatische“ Ansatz wäre ich denke, ein else Block hinzuzufügen, so dass der Wert der bedingten auswertet tatsächlich ist, was die Funktion zurück (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] 
} 

Nun, egal, welche logischer Zweig der Code nimmt, der Ausdruck, dass die Ergebnisse aus der Funktion zurückgegeben werden.

+0

Ahh das macht Sinn. Ich dachte, ohne das 'return'-Schlüsselwort würde Rost wissen," ok, er benutzt kein '' '' so muss er zurückkehren wollen "Danke :) – TheWebs

+1

Du hast Recht ... außer dass es nicht davon ausgeht" so er muss _von der Funktion_ zurückgeben wollen ". Alles ist ein Ausdruck in Rust - alles gibt einen Wert zurück. Ihr "if" -Konditional ist hier, was Rust annimmt, dass es "einen Wert von" zurückgeben möchte. Es ist nichts zugewiesen und so erwartet Rust, dass es Einheit zurückgibt (was '()' .. nichts ist). Stattdessen wird Ihre Bedingung zu einer 'Welt'-Instanz ausgewertet: daher der Fehler. –

Verwandte Themen