Niedawno znalazłem sposób obejścia tego. Chciałem stworzyć metodę w klasie tablicy z opcjonalnym parametrem, aby zachować lub odrzucić elementy w tablicy.
Sposób, w jaki to symulowałem polegał na przekazaniu tablicy jako parametru, a następnie sprawdzeniu, czy wartość tego indeksu była zerowa, czy nie.
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
Próbując naszą metodę klasy z różnymi parametrami:
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)
wyjściowa: ["1", "2", "a", "b", "c"]
Ok, fajnie, że działa zgodnie z planem. Teraz sprawdźmy, co się stanie, jeśli nie przejdziemy do trzeciej opcji parametru (1) w tablicy.
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)
wyjściowa: ["a", "b", "c"]
Jak widać, trzecia opcja w tablicy zostały usunięte, inicjując inną sekcję w metodzie i wyprowadzenie wszystkich wartości ASCII, które nie są w naszym zasięgu (32 -126)
Alternatywnie, moglibyśmy wystawić wartość jako zero w parametrach. Które wyglądają podobnie do poniższego bloku kodu:
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
Nieco się z tym sposobem: np. Jeśli próbujesz ustawić wartość domyślną dla 'scope' true i przekazujesz wartość' false', 'scope || = true' nie będzie działać. To ocenia to samo co 'nil' i ustawi go na' true' –
czy jest to możliwe z aktualną wersją ruby, 3 lata po tej odpowiedzi? – dalloliogm
@JoshPinter, ładne wyjaśnienie. Zasadniczo || = nie jest a = b lub c, wzdrygnąłem się widząc 'xyz || = true'. Mówi się, że jeśli jest zero, zawsze jest prawdą. Jeśli to prawda, to prawda. –