Visibility
Types, constants and methods are private by default. When such a symbol is
private, it's only available to modules that are in the same root namespace.
For example, private symbols defined in std.foo.baz are available to
std.bar.baz, as both are located in the same std root namespace.
Making types public
For types and constants, making them public is done as follows:
| Type | Private | Public |
|---|---|---|
| Constants | let Example = 10 | let pub Example = 10 |
| Fields | let @name: Type | let pub @name: Type |
| Types | type Example {} | type pub Example {} |
| Traits | trait Example {} | trait pub Example {} |
Making methods public
For methods the syntax is as follows:
| Type | Private | Public |
|---|---|---|
| Immutable | fn example {} | fn pub example {} |
| Mutable | fn mut example {} | fn pub mut example {} |
| Immutable async | fn async example {} | fn pub async example {} |
| Mutable async | fn async mut example {} | fn pub async mut example {} |
pub always comes after the keyword used to define a symbol (e.g. fn),
constants or method. The mut keyword in turn always comes directly before the
name of the method.
Processes
The fields and regular (non-async) instance methods of a process are private to the type, meaning only the process itself can access them:
type async Cat {
let @name: String
fn give_food {}
}
type async Main {
fn async main {
let garfield = Cat(name: 'Garfield')
garfield.name
garfield.give_food
}
}
If you try to run this program, the following compile-time errors are produced:
test.inko:11:5 error(invalid-symbol): the field 'name' can only be used by the owning process
test.inko:12:5 error(invalid-call): the method 'give_food' exists but is private
This rule is enforced to ensure no data race conditions are possible as a result of different processes trying to access and/or mutate the same data.