Ich mag diese funktionalen Stil:
module Enumerable
def diff
each_cons(2).map {|pair| pair.reverse.reduce :-}
end
end
EDIT: Ich habe erkannt, dass die reverse
völlig unnötig ist. Wenn dies eine funktionale Sprache wäre, hätte ich die Mustererkennung verwendet, aber Ruby unterstützt keine Mustererkennung. Es tut, unterstützt jedoch Destrukturierung binden, die eine gute Näherung für die Mustererkennung in diesem Fall ist.
each_cons(2).map {|first, second| second - first}
Kein smiley, obwohl.
Ich mag, wie das klingt, wenn Sie es gerade von links nach rechts vorlesen: "Wenden Sie für jedes Paar die Differenz zwischen dem ersten und zweiten Element des Paares an." In der Tat, ich mag normalerweise nicht den Namen collect
und bevorzugen map
statt, aber in diesem Fall, der liest noch besser: „Für jedes Paar, den Unterschied zwischen seinen Elementen sammeln“
each_cons(2).collect {|first, second| second - first}
Klingt fast wie eine Definition von erster Ordnung Unterschied.
Das ist süß, aber ziemlich ineffizient, wenn die Arrays groß werden ... –
eine gute 1.8 kompatible Lösung. Vielen Dank. – Peter
Sie könnten die Destrukturierungsbindung im Block anstelle der Indizierung verwenden: '{| first, second | erste - zweite} '. Außerdem ist in 1.8.7+ 'self [1 ..- 1]' gleichbedeutend mit 'drop (1)', was das ganze Ding so lesen lässt: 'drop (1) .zip (self) .collect {| first , Sekunde | erste - zweite} '. Auch wenn du Ruby nicht kennst und es nur laut wie Englisch liest, klingt es fast nachvollziehbar, wie eine mathematische Definition des Unterschieds erster Ordnung: "Kombiniere das Array mit sich selbst, indem du den Unterschied errechnest und die Ergebnisse sammelst . " –