2012-02-28 17 views
10

Estoy aprendiendo Ruby y he visto que un signo de exclamación al final de un nombre de método por convención significa que el método modifica self de alguna manera. ¿Por qué entonces no termina Array#delete con un signo de exclamación, como slice!, ya que delete borra un elemento de self? ¿Me estoy perdiendo algo fundamental?Convención de nomenclatura: ¿Por qué Array # delete no tiene signo de exclamación al final?

+0

Supongo que porque '# delete' solo puede eliminarse, por lo que no es necesario marcarlo. Algo como '# upper_case' se puede asignar a un objeto recién creado o sobrescribir el objeto original en la determinación del uso. – ScottJShea

+0

Sí, pero #delete sin indicador también podría devolver un clon menos el elemento especificado (Eso es lo que esperaba dada la ausencia de un indicador) :) –

+0

posible duplicado de [¿Por qué se usan los signos de admiración en los métodos de Ruby?] (Http: //stackoverflow.com/questions/612189/why-are-exclamation-marks-used-in-ruby-methods) –

Respuesta

15

Para citar Matz (ingeniero jefe de Ruby): (!)

La explosión no significa "destructor", ni la falta de ella significa que no destructiva tampoco. El signo de bang significa que "la versión de bang es más peligrosa que su equivalente no explosiva; manipúlala con cuidado".

Dado que Array#delete no tiene una contraparte menos peligrosa, no hay necesidad de la exclamación.

4

Los métodos "bang" no significan que modifique el receptor. Es una indicación de un método que es una versión más peligrosa de un método existente. Consulte David A. Black's description de la diferencia y response to a request para cambiar Ruby 2.0.

Este es un error muy común. Tenga en cuenta el muy voto muy erróneo respuesta here.

Cuestiones relacionadas