2015-06-05 13 views
9

In src/lib.rs ich habe folgendesWie importiere ich von einem Geschwistermodul?

extern crate opal_core; 

mod functions; 
mod context; 
mod shader; 

Dann in src/context.rs Ich habe so etwas wie dieses, die Symbole von src/shader.rs zu importieren versucht:

use opal_core::shader::Stage; 
use opal_core::shader::Shader as ShaderTrait; 
use opal_core::GraphicsContext as GraphicsContextTrait; 

use functions::*; // this import works fine 
use shader::*; // this one doesn't 

pub struct GraphicsContext { 
    functions: Gl 
} 

fn shader_stage_to_int(stage: &Stage) -> u32 { 
    match stage { 
     &Stage::Vertex => VERTEX_SHADER, 
     &Stage::Geometry => GEOMETRY_SHADER, 
     &Stage::Fragment => FRAGMENT_SHADER, 
    } 
} 

impl GraphicsContextTrait for GraphicsContext { 

    /// Creates a shader object 
    fn create_shader(&self, stage: Stage, source: &str) -> Box<ShaderTrait> { 
     let id; 

     unsafe { 
      id = self.functions.CreateShader(shader_stage_to_int(&stage)); 
     } 

     let shader = Shader { 
      id: id, 
      stage: stage, 
      context: self 
     }; 

     Box::new(shader) 
    } 
} 

Das Problem, dass die Aussage use shader::*; den Fehler verursacht wird ungelöster Import.

ich die Dokumentation lese und sie sagten, dass use Aussagen von der Wurzel der aktuellen Kiste gehen immer (opal_driver_gl), so dachte ich shader::*opal_driver_gl::shader::* importieren werden soll, aber es scheint nicht so zu tun. Muss ich hier die Schlüsselwörter self oder super verwenden?

Danke, wenn Sie helfen können.

+0

Haben Sie sich in eines der [anderen Fragen, die die gleichen Fehler erwähnen] sehen (http://stackoverflow.com/search?q=% 5Rest% 5D + ungelöst + Import)? Wenn ja, wie unterscheidet sich Ihre Frage von ihnen? Haben Sie versucht, einen [kleineren Testfall] (/ help/mcve) zu erstellen? – Shepmaster

+0

Ich habe die meisten "ungelösten Import" Fragen ausgecheckt. Sie konzentrieren sich hauptsächlich darauf, Symbole von außerhalb einer Kiste zu bekommen, aber ich möchte das Gegenteil tun. Ich werde versuchen, das Problem einzuschränken. – neon64

+1

Es ist eine gute Übung, uns zu sagen, was Sie versucht haben und welche Fragen Sie gesehen haben. Nennen Sie auch, warum diese Versuche und Fragen nicht funktionieren oder was Sie nicht von ihnen verstehen. Dies verhindert, dass wir Ihr tatsächliches Problem erraten, es Ihnen leichter machen, Antworten zu erhalten, und verbessert in der Regel Ihre Frage, wie nützlich Ihre Frage für zukünftige Suchende ist. – Shepmaster

Antwort

10

Um ein Modul auf der gleichen Ebene zu importieren, gehen Sie wie folgt vor:

random_file_0.rs:

// Note how this is a public function. It has to be in order to be 
// usable from other files (in this case `random_file_1.rs`) 
pub fn do_something() -> bool { 
    true 
} 

random_file_1.rs:

use super::random_file_0; 

#[test] 
fn do_something_else() { 
    assert!(random_file_0::do_something()); 
} 

oder alternative random_file_1.rs:

// This can be a public function, but does not have to be unless you 
// are using it somewhere else 
use ::random_file_0; 

#[test] 
fn do_something_else() { 
    assert!(random_file_0::do_something()); 
} 

lib.rs:

mod random_file_0; 
mod random_file_1; 

Siehe diesen Link: Rust By Example für weitere Informationen und Beispiele. Wenn das nicht, hier funktioniert der Code es zeigt:

fn function() { 
    println!("called `function()`"); 
} 

mod my { 
    pub fn indirect_call() { 
     // Let's access all the functions named `function` from this scope 
     print!("called `my::indirect_call()`, that\n> "); 

     // `my::function` can be called directly 
     function(); 

     { 
      // This will bind to the `cool::function` in the *crate* scope 
      // In this case the crate scope is the outermost scope 
      use cool::function as root_cool_function; 

      print!("> "); 
      root_cool_function(); 
     } 

     { 
      // `self` refers to the current module scope, in this case: `my` 
      use self::cool::function as my_cool_function; 

      print!("> "); 
      my_cool_function(); 
     } 

     { 
      // `super` refers to the parent scope, i.e. outside of the `my` 
      // module 
      use super::function as root_function; 

      print!("> "); 
      root_function(); 
     } 
    } 

    fn function() { 
     println!("called `my::function()`"); 
    } 

    mod cool { 
     pub fn function() { 
      println!("called `my::cool::function()`"); 
     } 
    } 
} 

mod cool { 
    pub fn function() { 
     println!("called `cool::function()`"); 
    } 
} 

fn main() { 
    my::indirect_call(); 
} 
+0

Danke für die tolle Information, leider verstehe ich schon die Grundlagen. @DK denke ich habe das Problem gefunden, da ich zyklische Glob-Importe verwendet habe. (Ich kam aus einer Java-Welt, wo 'import myPackage. *;' In Ordnung ist) – neon64

Verwandte Themen