Back to Examples

Optional fields

Fields of a record type can be marked as optional. These fields can be omitted when creating a value of the record type. A field f of record type r can be accessed via optional field access (e.g., r?.f) or member access (e.g., r["f"]), which will both return () if the field is not present in the record value.

A record that contains optional fields can be destructured. If the optional field is not available, the type of the variable becomes nil. The optional field value can also be removed from the record by assigning () to the optional field.

import ballerina/io;

type FullName record {
    string firstName;
    string lastName;

    // The `title` and `middleName` fields are optional.
    string title?;
    string middleName?;
};

public function main() {

    FullName name = {
        title: "Mr",
        firstName: "John",
        lastName: "Doe"
    };

    // Use the `?.` operator to access the optional field.
    io:println("Title: ", name?.title);

    // A variable of type `string?` is used to construct an optional field.
    string? middleName = name["middleName"];
    io:println("Middle name: ", middleName);

    // Remove the optional `title` field by assigning `()`.
    name.title = ();
    io:println(name.hasKey("title"));

    // When destructuring the record `name`, if the `title` field is absent,
    // then, its value becomes nil.
    var {title, firstName: _, lastName: _} = name;
    io:println(title is ());
}
$ bal run optional_fields.balTitle: MrMiddle name: falsetrue

Related links

PreviousComputed field key
NextOpen records