Fields
So far, we have seen features that were implemented as routines. An alternative to implementing a feature as a routine is implementing it as a field.
Argument Fields
Let us start with a small example that declares a feature Point
with two arguments x
and y
of type i32
,
which is a 32-bit signed integer value:
The arguments x
and y
are inner features of Point.
Argument features are always fields. Fields can store a value, they are similar
to function features without arguments and a pre-determined result value.
The example creates two instances of Point
with
values Point 3 4
and Point 5 12
and passes these
to routine show
. show
then calls Point.x
and Point.y
on its argument p
to print the point's
coordinates.
Non-Argument Inner Fields
Fields can also be declared in the code section of a routine. The following
example declares two fields p1
and p2
of
type Point
. As part of the declaration, instances
of Point
with values Point 3 4
and Point 5
12
are created. These points are assigned to p1
and p2
using the assignment operator :=
.
Like before, these points are passed to a routine show
, but this
time they are read from fields p1
and p2
.
Type Inference for Fields
Similar to the result type inference of function features, a field's type can
be inferred automatically from the value assigned to it, the type in the
declaration of p1
and p2
in this example can be
omitted:
Type Inference for Argument Fields
Fuzion can in some cases even infer the types of a feature's argument fields.
That way, feature declarations will look similar to implementations in a
dynamically typed language like Python. In the example, we can omit the type
in the declaration of Point
and show
:
Repeated Field Declarations
Field shadowing sometimes called variable shadowing is not allowed in fuzion.