2015-06-05 15 views
9

Trong src/lib.rs Tôi đã sauLàm cách nào để nhập từ mô-đun anh chị em?

extern crate opal_core; 

mod functions; 
mod context; 
mod shader; 

Sau đó, trong src/context.rs Tôi có một cái gì đó như thế này, mà cố gắng để nhập ký tự từ 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) 
    } 
} 

Vấn đề là rằng tuyên bố use shader::*; cung cấp cho các lỗi nhập chưa được giải quyết.

Tôi đã đọc tài liệu và họ nói rằng use báo cáo luôn luôn đi từ gốc của thùng hiện tại (opal_driver_gl) vì vậy tôi nghĩ shader::* nên nhập opal_driver_gl::shader::* nhưng dường như không làm như vậy. Tôi có cần sử dụng các từ khóa self hoặc super ở đây không?

Cảm ơn nếu bạn có thể trợ giúp.

+0

Bạn đã xem bất kỳ câu hỏi nào khác có liên quan đến cùng một lỗi] (http://stackoverflow.com/search?q=%) 5Brust% 5D + Chưa được giải quyết + Nhập khẩu)? Nếu vậy, câu hỏi của bạn khác với chúng như thế nào? Bạn đã cố gắng thực hiện [testcase nhỏ hơn] (/ help/mcve) chưa? – Shepmaster

+0

Tôi đã xem hầu hết các câu hỏi 'nhập chưa được giải quyết'. Họ chủ yếu tập trung vào việc lấy các biểu tượng từ bên ngoài một cái thùng nhưng tôi muốn làm ngược lại. Tôi sẽ cố gắng thu hẹp vấn đề. – neon64

+1

Nó được coi là thực hành tốt để cho chúng tôi biết những gì bạn đã thử và những câu hỏi mà bạn đã nhìn thấy. Cũng bao gồm lý do tại sao những nỗ lực và câu hỏi đó không hoạt động hoặc những gì bạn không hiểu từ chúng. Điều này ngăn chúng tôi đoán được vấn đề thực sự của bạn là gì, giúp bạn nhận được câu trả lời dễ dàng hơn và thường cải thiện mức độ hữu ích của câu hỏi của bạn đối với người tìm kiếm trong tương lai. – Shepmaster

Trả lời

10

Để nhập một mô-đun trên cùng cấp, làm như sau:

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

hoặc thay thế 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; 

Xem liên kết này: Rust By Example để biết thêm thông tin và ví dụ. Nếu điều đó không hiệu quả, dưới đây là mã hiển thị:

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

Cảm ơn thông tin tuyệt vời, thật không may là tôi đã hiểu những điều cơ bản. @ DK tôi nghĩ rằng đã tìm thấy vấn đề khi tôi sử dụng nhập khẩu toàn cầu theo chu kỳ. (Tôi đến từ một thế giới Java, nơi 'import myPackage. *;' Là tốt) – neon64

Các vấn đề liên quan