Check if all fields in a record have been set.

← Operators and Expressions · Ref: Q1087

Check if a record is set with the ? operator:

  if full?
    stdout.println("set")

'default operator ?' uses ANY-field semantics — returns true if ANY field is set. To require ALL fields, use 'override operator ?'.

See Q1089 for custom override operator ?.

Example

defines module qa.operators.checkrecordfullyset

  defines class

    AppConfig
      dbHost <- String()
      dbPort <- Integer()
      apiKey <- String()

      AppConfig()
        ->
          dbHost as String
          dbPort as Integer
          apiKey as String
        this.dbHost :=: dbHost
        this.dbPort :=: dbPort
        this.apiKey :=: apiKey

      AppConfig()
        -> dbHost as String
        this.dbHost :=: dbHost

      default operator

  defines program

    CheckRecordFullySetDemo()
      stdout <- Stdout()

      //Fully set config
      full <- AppConfig("db.prod", 5432, "secret-key-123")
      stdout.println(`Full config set?: ${full?}`)

      //Partially set — only dbHost provided
      partial <- AppConfig("db.dev")
      stdout.println(`Partial config set?: ${partial?}`)

      //Empty — no fields set
      blank <- AppConfig()
      stdout.println(`Empty config set?: ${blank?}`)

Common mistakes

E01073 — EK9 has no 'null'; use the '?' operator to test whether an object is set. See ek9 -h E01073 for details.

Incorrect:

${full != null}

Correct:

${full?}
Other ways to ask this
  • Test whether an object is fully initialised using ?
  • Determine if a record has any unset fields
  • In Java I'd check each field for null. How do I check if an EK9 object is set?
  • I need to verify that a config object has all required values before using it

Coming from another language?

Java: manual null checks per field, or Bean Validation @NotNull. Python: all(v is not None for v in vars(obj).values()). EK9: ? operator with default (any-field) or custom (all-field) semantics.

Keywords: check, operator, initialised, set, validate, isSet, ?