Ich verwende Rails 5 mit Ruby 2.4. Wie kann ich feststellen, ob eine Variable eine Zahl ist? Ich dachte, is_a? (Numerisch) wäre der richtige Weg, aber anscheinend nicht bei mir. Ich habe diesen Code
puts "guesses arr: #{guesses_arr}"
guesses_arr.map!{|str| str.is_a?(Numeric) && str == guesses_arr.max ? str : 0}
die mit stirbt
guesses arr: [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]
ArgumentError: comparison of Float with NaN failed
from /Users/davea/Documents/workspace/myproject/app/services/text_table_to_race_time_converter_service.rb:2121:in `max'
from /Users/davea/Documents/workspace/myproject/app/services/text_table_to_race_time_converter_service.rb:2121:in `block (2 levels) in guess_headers_from_data_cols'
from /Users/davea/Documents/workspace/myproject/app/services/text_table_to_race_time_converter_service.rb:2121:in `map!'
Ich kann dies nicht in einer Konsole reproduzieren, da ich anscheinend kein Array mit all diesen "NaN" -Werten erzeugen kann. Der Punkt ist, wie stelle ich sicher, dass diese in meiner Schleife nicht verglichen werden?
Sie können ein Array von NaN
Werten in der Konsole wie folgt erstellen :
[ 0.0 / 0.0 ] * 3
# => [NaN, NaN, NaN]
Es ist nicht ganz klar, was Ihr Code macht, aber es ist vielleicht erwähnenswert, dass max
die Ausnahme die Ausnahme auslöst und nicht der Gleichheitstest. Übrigens, wenn Sie versuchen, jeden Array-Wert mit dem Maximalwert zu vergleichen, möchten Sie möglicherweise max
außerhalb von map
, um ihn nicht mehrmals bewerten zu müssen.
Aufbauend auf der anderen Antwort hier auf das Ablehnen von NaN
s können Sie alles zusammenfügen, um so etwas zu erhalten:
# set up dummy data - 2 values and 3 NaNs
guesses_arr = [ 0.0 / 0.0 ] * 3 + [ 2.0, 3.0 ]
puts "guesses arr: #{guesses_arr}"
# => [NaN, NaN, NaN, 2.0, 3.0]
# remove NaNs in place
guesses_arr.reject!(&:nan?)
maximum = guesses_arr.max
guesses_arr.map!{|str| str.is_a?(Numeric) && str == maximum ? str : 0}
# => [ 0, 3.0 ]
Bearbeiten: Wenn Sie Ganzzahlen im Array verwechseln, versuchen Sie, sie zuerst in Floats umzuwandeln:
# set up dummy data - including floats and integers
guesses_arr = [ 0.0 / 0.0 ] * 3 + [ 2.0, 3.0, 0 ]
guesses_arr.map!(&:to_f).reject!(&:nan?)
# => [ 2.0, 3.0, 0.0 ]
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen