Son zamanlarda bunun üstesinden gelmenin bir yolunu buldum. Dizideki öğeleri tutmak veya atmak için isteğe bağlı bir parametre ile dizi sınıfında bir yöntem oluşturmak istedim.
Bunu simüle etme şeklim, parametre olarak bir dizi geçirip bu dizindeki değerin sıfır olup olmadığını kontrol etmekti.
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
Sınıf yöntemimizi farklı parametrelerle denemek:
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)
çıktı: ["1", "2", "a", "b", "c"]
Tamam, planlandığı gibi çalışan harika. Şimdi dizideki üçüncü parametre seçeneğini (1) geçmezsek ne olacağını kontrol edelim.
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)
çıktı: ["a", "b", "c"]
Gördüğünüz gibi, dizideki üçüncü seçenek kaldırıldı, böylece yöntemde farklı bir bölüm başlatılıyor ve aralığımızda olmayan tüm ASCII değerleri kaldırılıyor (32-126)
Alternatif olarak, değeri parametrelerde sıfır olarak verebilirdik. Aşağıdaki kod bloğuna benzer görünür:
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 için varsayılan değeri yapmaya çalışıyorsanız ve siz geçersenizfalse
,scope ||= true
işe yaramayacaktır. Aynı şeyi değerlendiriyornil
ve ayarlayacaktrue