Недавно я нашел способ обойти это. Я хотел создать метод в классе массива с необязательным параметром, чтобы сохранить или отбросить элементы в массиве.
То, как я имитировал это, передал массив в качестве параметра, а затем проверил, было ли значение в этом индексе нулевым или нет.
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
Попытка наш метод класса с различными параметрами:
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)
выход: ["1", "2", "a", "b", "c"]
Хорошо, здорово, что работает, как и планировалось. Теперь давайте проверим и посмотрим, что произойдет, если мы не передадим третий параметр параметра (1) в массиве.
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)
выход: ["a", "b", "c"]
Как вы можете видеть, третий вариант в массиве был удален, инициируя другой раздел в методе и удаление всех значений ASCII, которые не в нашем ассортименте (32 -126)
В качестве альтернативы мы могли бы указать значение в качестве параметра nil в параметрах. Какой будет выглядеть аналогично следующему блоку кода:
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
Немного gotcha с этим методом: например. Если вы пытаетесь сделать значение по умолчанию для 'scope' true, и вы переходите в' false', 'scope || = true' не будет работать. Он оценивает то же самое, что и «nil» и устанавливает значение «true» –
, возможно ли это с текущей версией ruby, через 3 года после этого ответа? – dalloliogm
@JoshPinter, приятный информация. В основном || = не является a = b или c, я съежился, увидев «xyz || = true». Это говорит, что это нуль, это всегда так. Если это правда, это правда. –