What method does each EK9 operator call internally?
← Operators and Expressions · Ref: Q1003
Every EK9 operator calls a specific method on the object. Here are the key mappings:
CONVERSION OPERATORS:
- $variable calls _string(), returns String - #? variable calls _hashcode(), returns Integer - #^ variable calls _promote(), returns a different type - $$ variable calls _json(), returns JSON
CHECKING OPERATORS:
- variable? calls _isSet(), returns Boolean (suffix, no parentheses)
COMPARISON OPERATORS:
- a == b calls _eq(), returns Boolean - a <> b calls _neq(), returns Boolean - a <=> b calls _cmp(), returns Integer (negative, zero or positive)
COPY/MERGE OPERATORS:
- a :=: b calls _copy(), copies b into a - a :~: b calls _merge(), merges b into a - a :^: b calls _replace(), replaces a content with b
The 'default operator' keyword generates _string, _json, _hashcode, _isSet, _cmp (with _eq, _neq and the ordering comparisons derived from it) and _copy from your declared fields. It does NOT generate #^ (_promote), :~: (_merge) or :^: (_replace) - those must be written by hand, and using them on a type without them is a compile error. Implement any operator manually for custom behaviour.
Example
defines module qa.operators.methodnames defines record Sensor location as String: String() reading as Float: 0.0 Sensor() -> location as String reading as Float this.location :=: location this.reading :=: reading default operator defines program OperatorMethodNamesDemo() stdout <- Stdout() sensor <- Sensor("Kitchen", 22.5) // $ calls _string() sensorText <- $sensor stdout.println(`String: ${sensorText}`) // #? calls _hashcode() sensorHash <- #? sensor stdout.println(`Hash: ${sensorHash}`) // ? calls _isSet() — suffix, no parentheses stdout.println(`Is set: ${sensor?}`) // <=> calls _cmp() other <- Sensor("Lounge", 20.0) comparison <- sensor <=> other stdout.println(`Compare: ${comparison}`)
Common mistakes
E50060 — EK9 objects have no toString() method — the $ prefix operator calls _string(); use $variable (or ${...} interpolation) for String conversion. See ek9 -h E50060 for details.
Incorrect:
stdout.println(`Is set: ${sensor.toString()}`)
Correct:
stdout.println(`Is set: ${sensor?}`)
Other ways to ask this
- What is the mapping between EK9 operators and their method names?
- What does each EK9 operator symbol translate to?
- Show me the operator to method name mapping in EK9
Coming from another language?
EK9 operators are method calls with fixed names. $ is _string() (like Java toString), #? is _hashcode() (like Java hashCode), ? is _isSet() (like Rust is_some).
Keywords: operator, name, string, mapping, method, hashcode, promote