2015-10-31 10 views
5

Esiste una convenzione Ruby per la denominazione dei metodi utilizzando bang (!). La convenzione è se il metodo cambia self, usiamo bang per far conoscere agli altri il bahaviour auto modificante.Perché la convenzione Ruby non viene seguita per l'array # keep_if?

Ad esempio Array#select non cambia self, ma Array#select! sì. Ma lo Array#keep_if cambia autonomamente. Non c'è nulla chiamato Array#keep_if!.

Quale potrebbe essere la ragione per non seguire la convenzione?

+4

Ci sono diversi metodi che cambiano 'self' i cui nomi non terminano con un punto esclamativo, come ad esempio la modalità Array'' delete' ',' 'delete_at' e delete_if'. Presumo che questi non siano sbalzati perché è ovvio dal nome che cambiano 'self' (anche se' String # delete' no!). Per estensione, dato che 'keep_if' è l'opposto di' delete_if' il primo non è sbattuto. 'Array # concat' è un esempio di un altro metodo che non è sbattuto perché è ovvio che cambia' self'. –

risposta

4

Matz, il creatore di Ruby, ha scritto: (!)

Il botto non significa "distruttiva", né la mancanza di essa vuol dire non distruttiva sia. Il segno del botto significa "la versione bang è più pericolosa della sua controparte non bang, maneggia con cura". Dal Ruby ha un sacco di metodi "distruttivi", se i segnali bang seguono il tuo parere , ogni programma Ruby sarebbe pieno di botte, quindi brutto.

Fonte: Ruby Forum

0

Questo è un malinteso comune. Il metodo bang è usato per distinguere tra una versione pericolosa e una sicura dello stesso metodo. Ciò non significa che cambierà necessariamente il suo ricevitore.

+0

In realtà, si tratta di "più sorprendente" e "meno sorprendente". Non c'è nulla di intrinsecamente pericoloso in "Process :: exit!", Ad esempio. –

Problemi correlati