foreach
ha un senso se si considera Option
essere un elenco che può contenere al massimo un singolo valore. Ciò porta anche a una corretta intuizione su molti altri metodi disponibili per Option
.
mi viene in mente almeno un motivo importante che si potrebbe desiderare di preferire foreach
in questo caso: elimina eventuali errori di runtime. Con l'approccio nonEmpty
, sarete a un certo punto devi fare una get
*, che può mandare in crash il programma di spettacolare se per caso dimentica di verificare la presenza di vuoto una sola volta.
Se si cancella completamente get
dalla propria mente per evitare errori di questo tipo, un effetto collaterale è che si ha anche meno bisogno di nonEmpty
! E inizierai a divertirti con foreach
e lascia che il compilatore si occupi di cosa dovrebbe accadere se lo Option
risulta vuoto.
vedrete questo concetto a saltar fuori in altri luoghi. Lei non avrebbe mai fare
if (age.nonEmpty)
Some(age.get >= 18)
else
None
Cosa si vede è piuttosto
age.map(_ >= 18)
Il principio è che si vuole evitare di dover scrivere codice che gestisce il caso fallimento - si vuole scaricare tale onere a il compilatore. Molti vi diranno che si dovrebbe mai uso get
, però attenzione si pensa che si sta pre-verifica. Questo rende le cose più facili.
* A meno che non si vuole realmente solo sapere se il Option
contiene un valore e non mi interessa per il valore, nel qual caso nonEmpty
è solo bene. In tal caso serve come una sorta di toBoolean
.
Mi piace questo ragionamento. Aggiungo anche che con foreach non si introduce mai 'get()' nel proprio codice, il che è una cattiva pratica con un 'Option' anche quando si testano correttamente' nonEmpty() '. Se devi fare qualcosa indipendentemente dal fatto che l'opzione sia vuota, 'match' con casi' Some (x) 'e' None' è la strada da percorrere. – pauljm