References allow for addressing other lvalues, including complex lvalue expressions, with an alias called a reference. References to lvalues are defined by placing a
"\" character in front of an expression that gives an lvalue, such as in the following examples:
reference r1 = \a;
reference r2 = \recs[rn].order[on];
References are especially convenient when aliasing an internal part of a complex data structure. Consider the following example (a list of records, where each record is a hash with a list of orders under the
"order" key - in the following example, we want to set the last record's last order's
"numberofitems" key to be equal to the number of elements under the order's
recs[recs.size() - 1].order[recs[recs.size() - 1].order.size() - 1].numberofitems = recs[recs.size() - 1].order[recs[recs.size() - 1].order.size() - 1].items.size();
In the above code, using references could greatly simplify the readability of the code:
reference lastrec = \recs[recs.size() - 1];
reference lastorder = \lastrec.order[lastrec.order.size() - 1];
lastorder.numberofitems = lastorder.items.size();
- Local variables that are referenced are automatically converted to a special type of local variable that is protected by a mutual-exclusion thread lock so that the reference can be safely used in background threads. The lvalue represented by the local variable will exist beyond its local scope; as long as the reference to the lvalue exists, the local variable's lvalue will exist and remain valid.
- Qore 0.8.5 universal lvalue references are supported; previously references could only be used with arguments to a function or method call or the like. As of Qore 0.8.5+, references can be used anywhere in Qore in any expression, even with references to local variables in background expressions and in closure argument lists.