2010-05-25 9 views
5

Recientemente vi un código que me recordó hacer esta pregunta. Últimamente, he estado viendo mucho de esto:¿Cuál es el problema con reftype {}?

use Scalar::Util 'reftype'; 

if (reftype $some_ref eq reftype { }) { ... } 

¿Cuál es el propósito de llamar reftype en una hashref anónima? ¿Por qué no simplemente decir eq 'HASH'?

+0

¿Lo preguntas porque acabas de verme hacer en ypath? –

+0

Este también es un ítem en _Programación efectiva de Perl_, y estoy seguro de que lo he explicado en algún lugar de Stackoverflow, pero usando ref() creo. reftype() devuelve el tipo de base incluso si está bendecido. –

+1

@brian, sus habilidades de detective han tenido éxito una vez más. – friedo

Respuesta

5

Puede compararlo con 'HASH' ahora, porque eso es lo que vuelve ahora.

Pero puede que no siempre.

Un buen ejemplo es el cambio que hicieron a una expresión regular compilada. En los viejos Perls el tipo era un ESCALAR. Sin embargo, desde 5.12 (creo) ahora es su propio tipo, REGEXP. Ejemplo:

perl -MScalar::Util=reftype -e "print reftype qr//" en 5.8 da SCALAR, pero lo mismo en 5.12 da REGEXP.

Se puede ver otra aplicación de esto desde this question pregunté hace un tiempo, excepto que no se utiliza en lugar de refreftype. El principio es el mismo sin embargo.

Simplemente, al compararlo con reftype {}, están garantizando que es exactamente ahora y en el futuro sin (y creo que esta es la característica principal) la codificación de otra cadena en su programa.

+2

Tiene perfecto sentido, gracias. Tal vez revise algún código antiguo y agregue algunas constantes de Readonly, p. '$ HASH_TYPE = reftype {};' – friedo

+0

¿En caso de que cambie a ASSOCIATIVE_ARRAY en algún momento? No te molestes No está cambiando. – ysth

+2

¿Estás seguro de que no va a cambiar en Perl 6, que se supone que tiene un modo Perl 5? Además, cosas como 1, 0, 42 y otros valores mágicos tampoco van a cambiar. Todavía no significa que deberíamos codificarlos, hacer posibles errores tipográficos que el compilador no puede detectar, etc. –

Cuestiones relacionadas