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:
my reference $r1 = \$a;
my 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 "items"
key):
$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 simplfy the readability of the code:
my reference $lastrec = \$recs[$recs.size() - 1];
my reference $lastorder = \$lastrec.order[$lastrec.order.size() - 1];
$lastorder.numberofitems = $lastorder.items.size();
- Note
- 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.
- Since
- 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.