Sto solo iniziando con Ruby e personalmente trovo che quanto segue sia una violazione del "principio di minima sorpresa". E cioè, citando da the documentation, che uniq! "rimuove gli elementi duplicati da sé. Restituisce nullo se non vengono apportate modifiche (ovvero, non vengono trovati duplicati)."Perché uniq! return nil se non ci sono duplicati
Qualcuno può spiegare questo, che mi sembra del tutto contro-intuitivo? Ciò significa che piuttosto che essere in grado di scrivere una riga di codice di seguito aggiungendo .uniq! per terminare la prima linea, io invece devo scrivere le seguenti due righe:
hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
hooks = hooks.uniq
O mi manca qualcosa, un modo migliore?
EDIT:
capisco che uniq! modifica il suo operando. Ecco il problema illustrato meglio spero:
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
Io sostengo che il modo uniq! i lavori lo rendono completamente privo di senso e inutile. Certo nel mio caso, come ho sottolineato, potrei semplicemente aggiungere .uniq alla prima riga. Comunque più avanti nello stesso programma spingo gli elementi su un altro array all'interno di un loop. Poi, sotto il loop, mi piacerebbe "de-dupe" l'array, ma non oso scrivere "hooks_tested.uniq!" perché potrebbe restituire zero; invece io must scrittura hooks_tested = hooks_tested.uniq
effetti mi sostengono questa è una mis-feature particolarmente egregio dal fatto che è un principio ben noto che, quando escogitare un metodo che restituisce un array, si dovrebbe sempre almeno restituisce un array vuoto, anziché zero
le POLS ha un significato specifico con Ruby: ". non sorprende Matz (creatore di Ruby) –
Inutile per lo scopo (errato) a cui si sta cercando di metterlo, concordato Utile se. stai provando a fare qualcosa che - per esempio - verifica il risultato di "uniq!". Probabilmente sarebbe stato quello che Matz aveva in mente. ;-) –
Sono d'accordo. questo è molto PHP-esque (casi eccezionali casuali, incongruenti). tutti gli altri casi, incluso 'uniq' restituisce quello originale. Quando 'uniq' non trova duplicati, restituisce l'array stesso. seriamente wtf. – ahnbizcad