2017-08-03 18 views
0

mit Ruby 2.4, ich habe dies in Teil meiner "if" AnweisungWie kann ich eine Null mit einer Ganzzahl vergleichen?

row_data.index{|x| DataHelper.my_function(x) } > num_var 

Leider stirbt die obige Aussage mit einem Fehler, wenn "row_data.index {| x | DataHelper.my_function (x)}" ergibt null. Gibt es eine Möglichkeit, das obige neu zu schreiben, so dass es "falsch" zurückgeben würde, wenn "row_data.index {| x | DataHelper.my_function (x)}" zu null ausgewertet würde? Ich möchte den Ausdruck nicht vor meiner "if" -Anweisung in einer Variablen speichern, da ich diese Anweisung möglicherweise nicht ausführen muss, wenn die Ausführung dort nicht erreicht wird. Ich habe das Gefühl, es gibt einen One-Liner, aber ich weiß nicht, was es ist.

Antwort

1

Sie können die Vorteile von nil.to_i nehmen 0

if row_data.index{ |x| DataHelper.my_function(x) }.to_i > num_var 
    # index is bigger than num_var 
else 
    # index is smaller or equal to num_var 
end 

Je nachdem, welche my_function Rückkehr und num_var darstellen, können Sie auch für den Fall von num_var == 0 Konto müssen möglicherweise.

+0

Gute Antwort. Sie sollten ein Leerzeichen zwischen den '{' und '|' hinzufügen. – moveson

+0

Das funktioniert, aber ich denke, die andere Antwort sollte aus den dort genannten Gründen akzeptiert werden. 'nil.to_i' ist problematisch und die empfangende Funktion erwartet eine ganze Zahl, keine truthy Abhilfe. Einzeilige Einzeiler sind großartig, aber nicht, wenn die Logik behindert wird. Kurz gesagt, wenn Sie eine Ganzzahl erwarten, stellen Sie sicher, dass Sie eine ganze Zahl erhalten. – whodini9

1

Kurzschluss Evaluationen ist die right way checking nil or false conditionals für zwei wichtige Gründe.

  1. einfachen Weg explicit conversions (to_s, to_i usw.) können Sie für einen Moment von erhöhten Ausnahmen/Fehler, aber manchmal retten sie den Teufel Trick spielen können Ihre conditionals brechen, wenn einem Ihrer verglichenen Werte der conditional ist von - 0, "", [] und usw. Daher sind explizite Vorsichtsmaßnahmen zu ergreifen, wenn man bedenkt, dass Ihr Code nach einem bestimmten Zeitpunkt nicht mehr lange genug dauert.

    Ex. - 1

    if x.to_i > -1  
        puts x "is not a negative integer" 
    else 
        puts x "is a negative integer" 
    end 
    

    kann es gefährlich sein, wie nil.to_i :=> 0 bei if x.to_i > -1 Logik Prüfung zugelassen wird in bedingten Block Eingabe mit umgerechnetem Wert (0 bei nil.to_i).

    Wahrscheinlich haben Sie nichts dagegen, ex. - 1 zum Drucken eines nil als: 0 is not a negative integer. Wie wäre es damit?

    if x.to_i 
        puts " 1/x is" 1/x 
    end 
    

    Es kann weiter ZeroDivisionError: divided by 0 als nil für jedes x erhöhen, und Sie haben in diesen Fällen besonders vorsichtig zahlen. Vielleicht möchten Sie nicht nil in Ihrem Block von der ersten Stelle zu unterhalten.

  2. Leistung und Clean Code sind zwei Summen Worte, die Sie jedes Mal hören. Short circuit evaluations (&&) nicht die Mühe über nachfolgenden conditionals wenn vorhergehenden Zustand ist false die conditionals schneller ausführen macht. Zusätzlich schützt es nil Werte, die in Ihren bedingten Block eingehen und macht ihn anfälliger.

Antwort auf Ihre Frage:

if (not row_data.index{|x| DataHelper.my_function(x) }.nil?) && (row_data.index{|x| DataHelper.my_function(x) } > num_var) 
    # do your if block here 
    # this keeps nil away 
else 
    puts "row_data.index{|x| DataHelper.my_function(x) } is nil" 
end 
+0

Ich weiß nicht, wie ich das auf meine Frage anwenden soll. –

+1

Setzen Sie Ihre Integer-Variable: row_data.index {| x | DataHelper.my_function (x)} anstelle von a, und wenn es nill ist, wird es die Schleife kurzschließen und nicht den zweiten Teil ausführen, wenn es nicht nil ist, wird es weiterlaufen (a> num_var) – srs

Verwandte Themen