← Back to context

Comment by throwawaymaths

14 days ago

Depends. Your module can have top level member fields or declarations. (By convention these modules would be capitalized) and in that case it would be instantiated as a struct (no objects in zig)

MyModule.zig

   somefield: u32,

   fn get(self: @This()) u32 {
      return this.somefield;
   }

main.zig

   const Module = @import("MyModule"); // note there are build parameters necessary to make this a module

   fn main() void {
     var x: Module = .{.somefield = 42 };

     _ = x.get() // => 42

     ...

A module is an import external to your project. Whether or not the import has top level fields or declarations, the mechanism is the same for structs, imports, and modules. For all imports (including modules) you should imagine an implicit `struct{...}` expression surrounding the code in your file.

I don't understand why you're repeating this. The module is a struct, not an object. That means that in Zig, module lookup and object member lookup are different things. A module is not an object, it is a struct, so looking something up in a module is not looking up a member in an object.

  • Please enlighten me, what are objects in zig? As far as i know this is not a defined concept in the language, so I'm assuming you think that structs are objects because struct namespace functions can be called with a syntactic sugar that makes it look like an object in a language that has them.

    Do you mean object like object file (to be linked)? Those don't have member functions as far as I know.

    • Why would I think that structs are objects?

      I'm using "object" as it is commonly used; essentially a value. In e.g Java or C or C++, the struct/class is a type, and an instance of the struct/class is an object.

      Accessing an object's members is a different operation from looking up a symbol in a namespace. Even in Zig.