On Tue, Jun 02, 2015 at 11:16:27AM -0400, Shawn Wilson wrote:
> I would argue that a nameref is a variable type.

I suppose you're right, insofar as it has its own special rules that
you have to know about.

A lot of people wanted declare -n to be more than it is.  It's really
just syntactic sugar that doesn't actually let you do anything you
couldn't do already (with printf -v for assignment, and ${!foo} or eval
for reference).  So, like declare -i, it's something you can completely
disregard if you're writing new scripts, and not maintaining other
people's scripts.

Ksh's nameref is completely different.  With one of ksh's two different
kinds of functions, you actually CAN use ksh nameref to pass a value
back to the caller without variable name collisions.

$ bash -c 'f() { local x=from_f; g x; }; g() { declare -n x="$1"; echo "$x"; }; 
f'
bash: warning: x: circular name reference

$ ksh -c 'f() { typeset x=from_f; g x; }; g() { typeset -n x="$1"; echo "$x"; 
}; f'
ksh: typeset: x: invalid self reference

$ ksh -c 'function f { typeset x=from_f; g x; }; function g { typeset -n 
x="$1"; echo "$x"; }; f'
from_f

Reply via email to