Kürzlich habe ich einen Weg gefunden, das zu umgehen. Ich wollte eine Methode in der Array-Klasse mit einem optionalen Parameter erstellen, um Elemente im Array zu behalten oder zu verwerfen.
Die Art und Weise, wie ich das simuliert habe, bestand darin, ein Array als Parameter zu übergeben und dann zu überprüfen, ob der Wert an diesem Index nil war oder nicht.
class Array
def ascii_to_text(params)
param_len = params.length
if param_len > 3 or param_len < 2 then raise "Ungültige Anzahl von Argumenten #{param_len} für 2 || 3." end
bottom = params[0]
top = params[1]
keep = params[2]
if keep.nil? == false
if keep == 1
self.map{|x| if x >= bottom and x <= top then x = x.chr else x = x.to_s end}
else
raise "Ungültige Option #{keep} an Argumentposition 3 in #{p params}, muss 1 oder nil sein"
end
else
self.map{|x| if x >= bottom and x <= top then x = x.chr end}.compact
end
end
end
Probieren wir unsere Klassenmethode mit verschiedenen Parametern aus:
array = [1, 2, 97, 98, 99]
p array.ascii_to_text([32, 126, 1]) # Konvertiere alle ASCII-Werte von 32-126 in ihren Zeichenwert, ansonsten behalte sie gleich (Dafür ist das optionale 1 gedacht)
Ausgabe: ["1", "2", "a", "b", "c"]
Okay, cool, das funktioniert wie geplant. Jetzt schauen wir mal, was passiert, wenn wir den dritten Parameter (1) im Array nicht übergeben.
array = [1, 2, 97, 98, 99]
p array.ascii_to_text([32, 126]) # Konvertiere alle ASCII-Werte von 32-126 in ihren Zeichenwert, ansonsten entferne sie (1 ist keine Parameteroption)
Ausgabe: ["a", "b", "c"]
Wie Sie sehen können, wurde die dritte Option im Array entfernt, was einen anderen Abschnitt in der Methode initiiert und alle ASCII-Werte entfernt, die nicht in unserem Bereich liegen (32-126)
Alternativ hätten wir den Wert als nil in den Parametern angegeben können. Das würde ähnlich aussehen wie der folgende Code-Block:
def ascii_to_text(top, bottom, keep = nil)
if keep.nil?
self.map{|x| if x >= bottom and x <= top then x = x.chr end}.compact
else
self.map{|x| if x >= bottom and x <= top then x = x.chr else x = x.to_s end}
end