Estoy empezando con Ruby y personalmente considero que lo siguiente es una violación del "principio de menor sorpresa". Y eso es, citando desde the documentation, ese uniq! "elimina elementos duplicados de uno mismo. Devuelve nil si no se realizan cambios (es decir, no se encuentran duplicados)".¿Por qué uniq! devuelva nil si no hay duplicados
¿Alguien puede explicar esto, lo cual me parece totalmente contrario a la intuición? Esto significa que en lugar de poder escribir una línea de código a continuación, se agrega .uniq! para poner fin a la primera línea, que en lugar tengo que escribir las dos líneas siguientes:
hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
hooks = hooks.uniq
O me estoy perdiendo algo, una mejor manera?
EDIT:
entiendo que uniq! modifica su operando. Aquí está el problema ilustra mejor espero:
hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
puts hooks.length #50
puts hooks.uniq!.length #undefined method `length' for nil:NilClass
Afirmo que el camino uniq! funciona lo hace completamente insensato e inútil. Claro que en mi caso, como señalé, podría agregar .uniq a la primera línea. Sin embargo, más adelante en el mismo programa, estoy empujando elementos hacia otra matriz dentro de un bucle. Luego, debajo del ciclo, me gustaría "quitarle el dupe" a la matriz, ¡pero no me atrevo a escribir 'hooks_tested.uniq!' porque podría devolver nada; en lugar de eso obligada escritura hooks_tested = hooks_tested.uniq
hecho I sostienen este es un mis-característica particularmente atroz en que es un principio bien conocido de que, al diseñar un método que devuelve una matriz, uno debe siempre al menos devolver una matriz vacía, en lugar de cero
los Pols tiene un significado específico con Ruby:. "no sorprende a Matz (creador de Ruby) –
inútil para el propósito (incorrecta) a la que usted está tratando de ponerlo, acordado práctico si. estás intentando hacer algo que, por ejemplo, prueba el resultado de 'uniq!'. Eso probablemente sería lo que Matz tenía en mente. ;-) –
Estoy de acuerdo. esto es muy parecido a PHP (casos excepcionales aleatorios e incongruentes). todos los demás casos, incluido 'uniq', devuelve el original. Cuando 'uniq' no encuentra duplicados, devuelve la matriz en sí. seriamente wtf. – ahnbizcad