Kürzlich habe ich einen Weg gefunden, dies zu umgehen. Ich wollte eine Methode in der Array-Klasse mit einem optionalen Parameter erstellen, um Elemente im Array beizubehalten oder zu verwerfen.
Ich habe dies simuliert, indem ich ein Array als Parameter übergeben und dann überprüft habe, ob der Wert an diesem Index Null war oder nicht.
class Array
def ascii_to_text(params)
param_len = params.length
if param_len > 3 or param_len < 2 then raise "Invalid number of arguments #{param_len} for 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 "Invalid option #{keep} at argument position 3 in #{p params}, must be 1 or nil"
end
else
self.map{|x| if x >= bottom and x <= top then x = x.chr end}.compact
end
end
end
Probieren Sie unsere Klassenmethode mit verschiedenen Parametern aus:
array = [1, 2, 97, 98, 99]
p array.ascii_to_text([32, 126, 1]) # Convert all ASCII values of 32-126 to their chr value otherwise keep it the same (That's what the optional 1 is for)
Ausgabe: ["1", "2", "a", "b", "c"]
Okay, cool, das funktioniert wie geplant. Lassen Sie uns nun überprüfen, was passiert, wenn wir die dritte Parameteroption (1) im Array nicht übergeben.
array = [1, 2, 97, 98, 99]
p array.ascii_to_text([32, 126]) # Convert all ASCII values of 32-126 to their chr value else remove it (1 isn't a parameter option)
Ausgabe: ["a", "b", "c"]
Wie Sie sehen können, wurde die dritte Option im Array entfernt, wodurch ein anderer Abschnitt in der Methode eingeleitet und alle ASCII-Werte entfernt wurden, die nicht in unserem Bereich liegen (32-126).
Alternativ hätten wir den Wert in den Parametern als Null ausgeben können. Welches würde ähnlich wie der folgende Codeblock aussehen:
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
scope
true festzulegen und übergebenfalse
,scope ||= true
funktioniert dies nicht. Es wertet das gleiche ausnil
und wird es auftrue