posted Thu 13 Nov 2014 by Michael Galloy under IDL
The accepted test for determining if the user passed in a value for an argument, say
arg1, has been:
if (n_elements(arg1) eq 0) then ...
But this can be thwarted since IDL 8.0, which introduced operating overloading, by an object that overloads
::_overloadSize and returns 0.
Brian Griglak in the current IDL Data Point article concludes:
So putting it all together, the best way to validate undefined vs null vs non-null is:
if (Size(val, /TYPE) eq 0) then begin
endif else if (ISA(val, /NULL)) then begin
endif begin ; I added this line and the next to Brian's code to
... ; distinguish between his three cases
This is a tricky issue to get right for your particular purposes because
0 has multiple meanings. In my case, I had two cases that I needed to handle:
- the number of elements in an array of objects
- determine if an argument was present (return nonzero value if it was an object with
_overloadSize returning 0)
These issues have always been muddled in IDL (
ARG_PRESENT doesn’t tell you if an argument is present, it indicates that it was passed as a named variable).
My manner of testing was to use
OBJ_VALID if the argument was an object and you didn’t want to use the normal operator overloading returned value:
function mg_n_elements, var, no_operatoroverload=noOperatoroverload
if (~keyword_set(noOperatoroverload) || size(var, /type) ne 11) then begin