mi piace questo stile funzionale:
module Enumerable
def diff
each_cons(2).map {|pair| pair.reverse.reduce :-}
end
end
EDIT: Ho appena realizzato che il reverse
è del tutto inutile. Se si trattasse di un linguaggio funzionale, avrei utilizzato la corrispondenza dei modelli, ma Ruby non supporta la corrispondenza dei modelli. Lo fa, tuttavia, supporta il bind di destrutturazione, che è un'approssimazione abbastanza buona per la corrispondenza del modello in questo caso.
each_cons(2).map {|first, second| second - first}
Nessun smile, comunque.
Mi piace come suona questa cosa se la leggete ad alta voce da sinistra a destra: "Per ogni coppia, applica la differenza tra il primo e il secondo elemento della coppia." In realtà, io di solito non mi piace il nome collect
e preferiscono map
invece, ma in questo caso, che recita ancora meglio: "Per ogni coppia, raccogliere la differenza tra i suoi elementi"
each_cons(2).collect {|first, second| second - first}
Sembra quasi una definizione della differenza del primo ordine.
fonte
2009-10-17 11:18:25
Questo è carino, ma piuttosto inefficiente se gli array diventano grandi ... –
una buona soluzione compatibile 1.8. Grazie. – Peter
È possibile utilizzare il binding distruttivo nel blocco anziché l'indicizzazione: '{| first, second | primo secondo} '. Inoltre, in 1.8.7+ 'self [1 ..- 1]' è equivalente a 'drop (1)', rendendo l'intera lettura come segue: 'drop (1) .zip (self) .collect {| first , secondo | primo secondo} '. Di nuovo, anche se non conosci Ruby e lo leggi solo ad alta voce come in inglese, sembra quasi comprensibile, come una definizione matematica della differenza del primo ordine: "Combina l'array con se stesso spostato di uno calcolando la differenza e raccogliendo i risultati ". –