2016-08-11 2 views
0

ich einige Zeit damit verbracht, einen Weg finden grundlegende Operationen für jedes Element in einem Array wie Summe, rund, etc. zu tunWie Rundung in der Arrays

Ich habe keine integrierte Möglichkeit zu sehen Um dies zu tun, habe ich versucht, mein eigenes zu erstellen, nachdem ich "Generic 'sum' And 'mean' Methods For Ruby Arrays" gefunden habe.

Kann jemand erklären, warum meine round Methode nicht funktioniert?

class Array 
    def sum 
    inject(nil) { |sum, x| sum ? sum + x : x } 
    end 

    def mean 
    sum/size 
    end 

    def round(p) 
    inject(nil) { |x| (x * 10^(p-1)).floor/10^(p - 1) } 
    end 
end 

puts [1.1234, 1.45656, 1.546567, 1.4577887].mean 
puts [1.1234, 1.45656, 1.546567, 1.4577887].round(6) 
+0

Die Antworten sind Ur- keine Ahnung, warum das nicht Standard-Ruby-Funktionalität ist? Ist es nicht im "Rubin-Stil" oder so? – Rilcon42

+2

Dies ist keine Standard-Ruby-Funktionalität, da "Array" als Element-Typ-Agnostiker gedacht ist. Wie würdest du definieren? [4, 'Hallo', nil, User.new (: admin)]. Sum'? – mudasobwa

+1

Ich schätze den Greenie, aber Sie könnten erwägen länger zu warten, bevor Sie eine Auswahl treffen (sagen wir, mindestens ein paar Stunden). Eine schnelle Auswahl kann andere Antworten entmutigen und möglicherweise diejenigen, die noch Antworten vorbereiten, kurzschließen. –

Antwort

1

Sie wollen Folgendes.

class Array 
    def sum 
    inject(:+) 
    end 

    def mean 
    sum/size.to_f 
    end 

    def round(p) 
    map { |n| n.round(p) } 
    end 
end 

puts [1.1234, 1.45656, 1.546567, 1.4577887].mean 
1.3960789249999999 

puts [1.1234, 1.45656, 1.546567, 1.4577887].round(6) 
1.1234 
1.45656 
1.546567 
1.457789 

anzumerken, dass sum.to_f (oder size.to_f) benötigt wird, wenn die Anordnung nur ganze Zahlen enthält. Wenn arr.sum = 3 und arr.size = 2, sum/size #=> 1, wobei sum/size.to_f #=> 1.5.

1

Zur Beantwortung der warum Teil Ihrer Frage gibt es drei Probleme mit der Umsetzung:

  1. Conceptual: inject verwendet wird, eine Reihe von Dinge zu bekommen und sie in eine Sache kombinieren. Hier haben Sie Dinge und wollen die gleiche Anzahl von anderen Dinge nebeneinanderlegen. Das Verfahren, das zu tun ist map:

    [1, 2, 3].inject(:+) # => 6 
    [-1, 2, -3].map(&:abs) # => [1, 2, 3] 
    
  2. syntaktische: ^ ist eine bitwise XOR, nicht an der Macht. Um dies zu tun, ist der Operator **.

  3. Grundlegende mathematische: lässt eine Plausibilitätsprüfung vornehmen, indem Sie versuchen, die Anzahl 1.77 ein Komma abzurunden:

    (17,7) .floor/10 = 1,7