2009-06-24 44 views
1

Ich habe gesucht/gegoogled, aber ich habe mit dem folgenden Problem zu kämpfen.LocalJumpError (Ruby on Rails)

Ich baue eine Rails 2.3.2 Anwendung und eine der Anforderungen ist es, den Median einer Reihe von Ergebnissen zu berechnen. Ich benutze Code für die Berechnung des Medians aus dem Ruby Cookbook, laufe aber weiter auf ein Problem mit dem Fehler 'LocalJumpError - no block given', wenn ich versuche, den Median eines Arrays mit einer ungeraden Anzahl von Mitgliedern zu finden.

Das Codebeispiel meiner Meinung nach ist wie folgt:

<%= survey_response.median([6,4,5,4,4,2]) %> 

dann in survey_response.rb Modellen sind die Methoden, wie folgt:

def mean(array) 
    array.inject(array.inject(0) { |sum, x| sum += x }/array.size.to_f) 
end 

def median(array,already_sorted=false) 
    return nil if array.empty? 
    array = array.sort unless already_sorted 
    m_pos = array.size/2 
    return array.size % 2 == 1 ? array[m_pos] : mean(array[m_pos-1..m_pos])  
end 

Der Fehler wird verursacht, wenn die Median-Methode zurück verweist zu der mittleren Methode, um das Medium mit einer ungeraden Anzahl von Elementen im Array zu erhalten. Ich kann einfach nicht herausfinden, warum ich diesen Fehler bekomme oder wie ich ihn beheben kann - also würde ich jede Hilfe/Anleitung/Lachen, die jemand mir anbieten könnte, sehr schätzen!

Dank

Simon

Antwort

1

Lis sieht aus wie es ist wegen Ihnen einen Fractional-Index in das Array verwendet wird. Versuchen Sie ersetzen:

m_pos = array.size/2 

mit:

m_pos = (array.size/2) .ceil

Versuchen Sie auch, Ihre mittlere Funktion dieser Wechsel:

def mean(array) 
    array.inject(0) { |sum, x| sum += x }/array.size.to_f 
end 
+0

Hey vielen Dank für die Antwort - leider macht das keinen Unterschied. Ich bekomme immer noch den gleichen Fehler, wenn eine ungerade Anzahl von Elementen im Array vorhanden ist. Gibt es weitere Informationen, die ich Ihnen zur Verfügung stellen kann? – simonyoung

+0

Danke - mit der Bearbeitung der mean() -Funktion funktioniert das auch gut. – simonyoung

1

Bessere Code :

def mean(array) 
    array.inject { |sum, n| sum + n }/array.length.to_f 
end 

def median(array) 
    return nil if array.empty? 
    array.sort! 
    middle = array.length/2 
    (array.length % 2 == 1) ? array[middle] : mean([array[middle-1], array[middle]]) 
end 

puts median([5,11,12,4,8,21]) # => 9.5 
+0

Hey Ich fügte hinzu: Zahlen = numbers.sort , da das Array Sortierung muss, bevor Sie den Median finden, aber es ist definitiv anders mein Problem behoben. Danke vielmals! – simonyoung

1

Das mean Methode sieht schrecklich verpfuscht. Versuchen Sie dies:

 
def mean(array) 
    a.inject(0) { |sum,x| sum += x }/a.size.to_f 
end 
+0

Danke - Ersetzen Sie die Mean() -Methode mit Ihrer Alternative auch das Problem behoben und gibt mir eine Mean() -Methode für den Einsatz auch anderswo. – simonyoung

+0

Ha ha. Es ist wohl nichts anderes als Mr.Matt seinen Post gut 20 Minuten nachdem ich auf tatsächlichen Fehler im Original-Code hingewiesen und meine Korrektur der 'Mean'-Methode in seinem Schnitt kopiert hat. –

+0

Außer, dass ich diese Änderung 4 Minuten vor Ihrer Antwort vorgenommen habe. – Codebeef