2015-06-05 3 views
9

В src/lib.rs У меня есть следующиеКак я могу импортировать из модуля родства?

extern crate opal_core; 

mod functions; 
mod context; 
mod shader; 

Тогда в src/context.rs у меня есть что-то вроде этого, который пытается импортировать символы из src/shader.rs:

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

Проблема в том, что оператор use shader::*; дает ошибку неразрешенный импорт.

Я читал документы, и они сказали, что use заявление всегда идут от корня текущей обрешетки (opal_driver_gl), так что я думал, что shader::* следует импортировать opal_driver_gl::shader::*, но он не появляется, чтобы сделать это. Нужно ли использовать здесь self или super?

Спасибо, если вы можете помочь.

+0

Вы смотрели на любом из [других вопросов, которые упоминают ту же ошибку] ​​(http://stackoverflow.com/search?q=% 5Brust% 5D + Нерешенные + импорт)? Если да, то как ваш вопрос отличается от них? Вы пытались сделать [меньший тест] (/ help/mcve)? – Shepmaster

+0

Я проверил большинство вопросов «неразрешенного импорта». Они в основном сосредоточены вокруг получения символов снаружи ящика, но я хочу сделать наоборот. Я попытаюсь сузить проблему. – neon64

+1

Считается хорошей практикой рассказать нам, что вы пробовали, и какие вопросы вы видели. Также укажите, почему эти попытки и вопрос не работают или что вы от них не понимаете. Это мешает нам догадываться, какова ваша настоящая проблема, облегчает вам получение ответов и, как правило, улучшает вашу полезность вашего вопроса для будущих поисковиков. – Shepmaster

ответ

10

Чтобы импортировать модуль на том же уровне, выполните следующие действия:

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()); 
} 

или альтернативный 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; 

Смотрите эту ссылку: Rust By Example для получения дополнительной информации и примеров. Если это не работает, вот код, он показывает:

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

Спасибо за отличную информацию, к сожалению, я уже понимаю основы. @DK, я думаю, нашел проблему, поскольку я использовал циклический импорт глобусов. (Я пришел из Java-мира, где 'import myPackage. *;' Отлично) – neon64

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

  • Нет связанных вопросов^_^