2016-04-02 3 views
0

Mein Code läuft gut, aber erhalten Fehler, wenn ein leeres Array übergeben. Ich verstehe, warum, aber ich weiß nicht, wie ich es beheben soll.Code erhält Fehler, wenn ein leeres Array übergeben

def format_comma_and(array) 

    output ="" 

    if array.empty? 
    return output 
    else 
    array.each.with_index do |x,i| 
     if array.length-2 == i 
      output << x + " and " 
     elsif array.length-1 == i 
      output << x 
     else 
      output << x + ", " 
     end 
    end 
    return output 
end 

end 
+1

Welche Fehler erhalten Sie, Chef? Dieser Code gibt eine leere Zeichenfolge zurück, wenn das Array leer ist. Es ist also wahrscheinlich der Code, der diese Methode aufruft, der das Problem yo aufweist. –

+0

Entschuldigung. undefinierte Methode '+ 'für nil: NilClass (NoMethodError) –

+0

es ist eine Herausforderung für Codewars. Er übergibt alle Tests, reicht aber aufgrund dieses Fehlers nicht aus. –

Antwort

0

Sehr einfach nur einen Standardwert für das Argument für die Methode an der Spitze format_comma_and(array=[]), hinzufügen, wenn das Verfahren ohne Parameter aufgerufen wird sagen können. (Dh format_comma_and()), dann wird Null auf Ihre Methode gesendet, die dann einen Fehler wie diese verursachen können, so lange, wie es ist ein Standardwert dies nicht geschehen sollte:

def format_comma_and(array=[]) 

    output ="" 

    if array.empty? 
    return output 
    else 
    array.each.with_index do |x,i| 
     if array.length-2 == i 
      output << x + " and " 
     elsif array.length-1 == i 
      output << x 
     else 
      output << x + ", " 
     end 
    end 
    return output 
end 

end 

Alternativ können Sie dies tun:

def format_comma_and(array=[]) 
return "" if array.size < 1 
return "#{array[0]}" if array.size == 1 
array[0..-2].join(", ") + " and #{array[-1]}" 
end 


format_comma_and([1,2,3,4]) 
#=> "1, 2, 3 and 4" 
format_comma_and([1,2,3]) 
#=> "1, 2 and 3" 
format_comma_and([1,2]) 
#=> "1 and 2" 
format_comma_and([1]) 
#=> "1" 
format_comma_and([]) 
#=> "" 
format_comma_and() 
#=> "" 
0

Ich habe gerade Ihren Code getestet und es wird kein Fehler ausgelöst, wenn ein leeres Array übergeben wird.

Es wird jedoch ein Fehler ausgelöst, wenn Sie das folgende Argument übergeben: [nil].

each_with_index arbeitet auf jedem Element des Arrays. Wenn das erste Element nil ist (dies ist anders als das Array leer ist), dann Code output = nil + " and "

Eine schnelle Lösung wäre zu nennen compact auf dem Array zu nennen versucht, also setzen Sie die folgenden an der Spitze der Methode:

array = array.compact 

Dies wird alle Nullwerte entfernen.

Oder Sie könnten Ihr Array filtern, um alle ungültigen Elemente loszuwerden. Ich bin mir nicht sicher, was Ihre Anweisungen sind, aber sehen Sie das folgende Beispiel:

array = [ nil, false, "string", 111, {}, [] ] 
array = array.select { |item| [String, Integer].include?(item.class) } 
array == ["string", 111] # => true 
0

Es scheint, dass Sie wirklich, so etwas schreiben wollen:

def format_comma_and(array) 
    return if array.empty? 
    *head, tail = array 
    [head.join(", "), tail].join(" and ") 
end 
format_comma_and([1,2,3,4,5]) 
#=> "1, 2, 3, 4 and 5" 
format_comma_and([1,2]) 
#=> "1 and 2" 
format_comma_and([]) 
#=> nil 
+0

Nur zu beachten, wenn Sie 'format_comma_and ([1])' 'ausführen, erhalten Sie' "und 1" ', was möglicherweise nicht ideal ist, wenn die Kata nur" 1 "erwartet. –

1

können Sie fügen „comma_and“ auf diese Weise :

def format_comma_and(a = []) 
    a[0...-1].any? ? a[0...-1] * ',' + " and #{a[-1]}" : "#{a[-1]}" 
    end 
+0

Dies ist sicherlich das prägnanteste der Gruppe. –

Verwandte Themen