2012-06-19 15 views
5

pensé que por convención, sólo los métodos con un signo de exclamación alteraron el objeto.¿Por qué método pop de la matriz no tiene un signo de exclamación?

> array = [1, 2, 3] 
=> [1, 2, 3] 
> array.pop 
=> 3 
> array 
=> [1, 2] 

¿Por qué no es Array 's pop método llamado pop!?

+0

estoy con Mauricio- -No es sorprendente. estás estallando. Que la estructura esté actualizada es implícita. –

Respuesta

11

Eso no es del todo correcto.

De The Ruby Style Guide

Los nombres de los métodos potencialmente "peligrosos" (es decir, métodos que modifican uno mismo o los argumentos, salida! (No ejecutar los finalizadores como salida lo hace), etc.) debe terminar con una signo de exclamación si existe una versión segura de ese método peligroso.

Y el nombre del método pop dice exactamente lo que está haciendo, por lo que no es necesario firmarlo con un signo de exclamación.

1

Esta convención sigue siendo válida, pero pop es un método bien conocido de todas las implementaciones de la pila, si pop algo de una pila lo está eliminando efectivamente.

Eso es solo conocimiento común en las estructuras de datos, los chicos de ruby ​​simplemente se perdieron agregando el signo !.

+0

No, no existe tal convención. (El citado Matsumoto en mi respuesta es el diseñador del lenguaje). – steenslag

+0

Intenta leer el texto que citaste @steenslag, es posible que encuentres algo en la primera línea. –

2

"La segunda convención es que cualquier método cuyo nombre termina con un signo de exclamación debe utilizarse con precaución. (...) A menudo, los métodos que terminan con un signo de exclamación son mutators, que alteran el estado interno de un objeto. Pero esto no siempre es así, hay muchos mutadores que no terminan con un signo de exclamación, y un número de no mutadores que lo hacen. Los métodos de mutación (como Array.fill) que no tienen una variante no mutante no suelen tener un signo de exclamación (sic) ".

(El lenguaje de programación Ruby, Flanagan & Matsumoto, página 180)

El libro continúa con el ejemplo exit frente exit! (tanto nonmutating;. exit! saltarse todos los ganchos at_exit)

Cuestiones relacionadas