[Ruby] Schwierigkeiten beim Refactoring logischer Operatoren (Genauigkeit und Lesbarkeit)

Als Ergebnis des Versuchs herauszufinden, sich nicht zu wiederholen, gab es Fälle, in denen der ursprüngliche Zweck nicht erreicht werden konnte, daher werde ich ihn als Artikel belassen.

Anforderungsdefinition

Angenommen, Sie möchten nur eine bestimmte Zeichenfolge eingeben. (Im folgenden Fall wird die Eingabe von "0", "1", "2" anhand der if-Anweisung beurteilt.)

Beschreibung mit logischen Operatoren

input_number = gets.chomp
sample_number = ["0","1","2"]

if input_number == "0" || input_number == "1" || input_number == "2"
    puts "Eingabe ist 0,1,Es ist eines von 2."
 else
    puts "0,1,Ein anderes Zeichen als 2 wurde eingegeben!"
end

Logischer Operator||Es scheint, dass der (oder) Teil lang ist ... Ich versuche es durch Versuch und Irrtum einfacher zu machen.

Versuchen Sie es mit der Methode Between?

case1 between?Methode


input_number = gets.chomp
sample_number = ["0","1","2"]

#Die eingegebene Zeichenfolge ist"0"Von"2"Gibt die Wahrheit zurück, ob es dazwischen liegt oder nicht.
t_or_f = input_number.between?("0", "2")

if t_or_f == true
  puts "Die eingegebene Zeichenfolge ist 0,1,Ist einer von 2"
else
  puts "Andere Charaktere sind enthalten!"
end

Die Anzahl der Variablendefinitionen wurde um eins erhöht. Wenn Sie jedoch mehr Zeichenfolgen akzeptieren möchten, müssen Sie weniger als den logischen Operator hinzufügen oder ändern. Es stellt sich heraus, dass das Refactoring beendet ist und ein weiteres Problem auftritt. Wenn es eine nicht verwandte Zeichenfolge wie ein Alphabet enthält, ist es falsch, aber eine Eingabe wie "0120" oder "1.9" wird als wahr zurückgegeben. Was ist mit dem nächsten?

Versuchen Sie es mit den Methoden any? Und include

any?Methode und umfassen?Methode


input_number = gets.chomp
sample_number = ["0","1","2"]

#any?Methode: Gibt true zurück, wenn eine der Bedingungen erfüllt ist, false, wenn keine der Bedingungen erfüllt ist
#Block{}Verarbeitung in ... Probe_numberの配列内の要素をBlock引数nに代入。
#input_Beurteilt, ob das Blockargument n in der Zahl enthalten (enthalten) ist, und gibt wiederholt wahr oder falsch zurück (in diesem Fall dreimal).
t_or_f = sample_number.any? {|n| input_number.include?(n)}

if t_or_f == true
  puts "Die eingegebene Zeichenfolge ist 0,1,Ist einer von 2"
else
  puts "Andere Charaktere sind enthalten!"
end

In diesem Fall gibt die Eingabezeichenfolge entweder 0, 1 oder 2 zurück und gibt immer true zurück. (Beispiel: 1234 => true, abc0120 => true)

Fazit

Immerhin der logische Operator||Strenge Eingabe ist die genaueste.

in? Methode (* nur Schienen)

Der erweiterte Ruby in Rails hat anstelle des Ruby-Originals eine __in? -Methode __. In diesem Fall werden nur 0,1,2 akzeptiert, 01 usw. werden nicht bestanden.

in?Methode


input_number = gets.chomp
if input_number.in?(["0", "1", "2"])
 puts "Die eingegebene Zeichenfolge ist 0,1,Ist einer von 2"
else
  puts "Andere Charaktere sind enthalten!"
end

Recommended Posts

[Ruby] Schwierigkeiten beim Refactoring logischer Operatoren (Genauigkeit und Lesbarkeit)
11 Entspricht Vergleichs- und logischen Operatoren
Schreiben Sie Schlüssel und Werte in Ruby
Dinge, die beim Kombinieren von if-Anweisungen und logischen Operatoren zu beachten sind
Blasensortierung durchführen und mit Ruby sortieren auswählen
Zusammenfassung der Hashes und Symbole in Ruby
[Ruby] Schleifenunterscheidung und Verwendung in Ruby
Unterschied zwischen "|| =" und "instance_variable_defined?" Im Ruby-Memo
[Ruby] Grundlegender Schlüssel, um beim Refactoring stark zu sein
[Verständnis] Unterschied zwischen Hash und Array in Ruby
Fügen Sie CSV-Dateien mit "'" und "" "in Ruby 2.3 in MySQL ein