Récemment, j'ai trouvé un moyen de contourner cela. Je voulais créer une méthode dans la classe du tableau avec un paramètre facultatif, pour conserver ou supprimer des éléments du tableau.
La façon dont j'ai simulé cela était de passer un tableau comme paramètre, puis de vérifier si la valeur à cet index était nulle ou non.
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
Essayer notre méthode de classe avec différents paramètres:
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)
production: ["1", "2", "a", "b", "c"]
D'accord, c'est cool qui fonctionne comme prévu. Maintenant, vérifions et voyons ce qui se passe si nous ne transmettons pas la troisième option de paramètre (1) dans le tableau.
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)
production: ["a", "b", "c"]
Comme vous pouvez le voir, la troisième option du tableau a été supprimée, initiant ainsi une section différente dans la méthode et supprimant toutes les valeurs ASCII qui ne sont pas dans notre plage (32-126)
Sinon, nous aurions pu attribuer la valeur nulle dans les paramètres. Ce qui ressemblerait au bloc de code suivant:
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 et que vous passezfalse
,scope ||= true
cela ne fonctionnera pas. Il évalue la même chosenil
et le définira àtrue