Recientemente he encontrado una forma de evitar esto. Quería crear un método en la clase de matriz con un parámetro opcional, para mantener o descartar elementos en la matriz.
La forma en que simulé esto fue pasando una matriz como parámetro y luego verificando si el valor en ese índice era nulo o no.
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
Tratando nuestra método de clase con diferentes parámetros:
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)
de salida: ["1", "2", "a", "b", "c"]
bien, fresco que funciona según lo previsto. Ahora revisemos y veamos qué sucede si no pasamos la tercera opción de parámetro (1) en la matriz.
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)
de salida: ["a", "b", "c"]
Como se puede ver, la tercera opción de la matriz se ha eliminado, dando así inicio a una sección diferente en el método y la eliminación de todos los valores ASCII que no están en nuestra gama (32 -126)
Alternativamente, podríamos haber emitido el valor como nulo en los parámetros. Que un aspecto similar al siguiente bloque de código:
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
Un poco con este método: p. Si intenta hacer que el valor predeterminado para 'scope' sea verdadero y pase' false', 'scope || = true' no funcionará. Evalúa lo mismo que 'nil' y lo configurará en' true' –
¿es posible con la versión actual de ruby, 3 años después de esta respuesta? – dalloliogm
@JoshPinter, buena explicación. Básicamente || = no es a = b o c, me encogí al ver 'xyz || = true'. Está diciendo que si es nula, siempre es verdad. Si es verdad, es verdad. –