in reply to Re: Re: has it been blessed?
in thread has it been blessed?

Efficiency is nice, but there's something to be said for correctness as well. You've also forgotten REF, CODE, and LVALUE.

Comparing the return value from ref to a list of known types is simply the wrong approach. Either you'll forget something, or a new type will be added in a future version and your code will break.

Go with the UNIVERSAL::isa() approach. Really.

Replies are listed 'Best First'.
Re: Re: Re: Re: has it been blessed?
by rjray (Chaplain) on Mar 07, 2002 at 20:35 UTC

    I agree, but to clarify, the best approach would seem to be:

    if (ref($obj) and UNIVERSAL::isa($obj, 'UNIVERSAL')) { ... }

    Well, "best" in absence of the blessed primitive, of course...


      if (UNIVERSAL::isa($obj, 'UNIVERSAL')) { is more than enough. If it's not a reference, UNIVERSAL::isa() will return undef. Don't bother doing a check twice.

      We are the carpenters and bricklayers of the Information Age.

      Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

        The reason I wrote it that way is that ref($obj) is a single-opcode operation, much less expensive than the execution of UNIVERSAL::isa($obj, 'UNIVERSAL'). Unless you know for certain that the value being tested will a reference the majority of the time, then you can save a reasonable amount of execution time with ref() coupled with the short-circuiting and operator. I stand behind this one.


        UNIVERSAL::isa($obj, 'UNIVERSAL') will also return true if $obj is the string 'UNIVERSAL', so the ref check is actually useful.