In src/lib.rs
I have the following
extern crate opal_core; mod functions; mod context; mod shader;
Then in src/context.rs
I have something like this, which tries to import symbols from 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) } }
The problem is that the statement use shader::*;
gives the error unresolved import.
I was reading the docs and they said that use
statements always go from the root of the current crate (opal_driver_gl
) so I thought shader::*
should be importing opal_driver_gl::shader::*
but it doesn't appear to do so. Do I need to use the self
or super
keywords here?
Thanks if you can help.
You need to use the import keyword along with the desired module name. When interpreter comes across an import statement, it imports the module to your current program. You can use the functions inside a module by using a dot(.) operator along with the module name.
To use the module, you have to import it using the import keyword. The function or variables present inside the file can be used in another file by importing the module.
Importing module from a package We can import modules from packages using the dot (.) operator. Now, if this module contains a function named select_difficulty() , we must use the full name to reference it. Now we can directly call this function.
Note that the behavior of use
has changed from Rust 2015 to Rust 2018. See What are the valid path roots in the use keyword? for details.
To import a module on the same level, do the following:
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()); }
or an alternative random_file_1.rs:
use crate::random_file_0; #[test] fn do_something_else() { assert!(random_file_0::do_something()); }
lib.rs
mod random_file_0; mod random_file_1;
See Rust By Example for more information and examples. If that doesn't work, here is the code it shows:
fn function() { println!("called `function()`"); } mod cool { pub fn function() { println!("called `cool::function()`"); } } mod my { fn function() { println!("called `my::function()`"); } mod cool { pub fn function() { println!("called `my::cool::function()`"); } } pub fn indirect_call() { // Let's access all the functions named `function` from this scope! print!("called `my::indirect_call()`, that\n> "); // The `self` keyword refers to the current module scope - in this case `my`. // Calling `self::function()` and calling `function()` directly both give // the same result, because they refer to the same function. self::function(); function(); // We can also use `self` to access another module inside `my`: self::cool::function(); // The `super` keyword refers to the parent scope (outside the `my` module). super::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_function; root_function(); } } } fn main() { my::indirect_call(); }
To import a module on the same level, do the following:
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()); }
or an alternative random_file_1.rs
:
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;
Here is another example from a previous version of 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(); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With