Nuevas características en Ruby 2.3 y 2.4
Es bueno estar al tanto de las nuevas características del lenguaje que ayudarán a su juego de golf. Hay algunos geniales en los últimos Rubies.
Ruby 2.3
El operador de navegación segura: &.
Cuando llama a un método que puede regresar nil
pero desea encadenar llamadas de método adicionales si no es así, desperdicia bytes manejando el nil
caso:
arr = ["zero", "one", "two"]
x = arr[5].size
# => NoMethodError: undefined method `size' for nil:NilClass
x = arr[5].size rescue 0
# => 0
El "operador de navegación segura" detiene la cadena de llamadas a métodos si uno regresa nil
y regresa nil
para la expresión completa:
x = arr[5]&.size || 0
# => 0
Array#dig
Y Hash#dig
Acceso profundo a elementos anidados, con un bonito nombre corto:
o = { foo: [{ bar: ["baz", "qux"] }] }
o.dig(:foo, 0, :bar, 1) # => "qux"
Devuelve nil
si llega a un callejón sin salida:
o.dig(:foo, 99, :bar, 1) # => nil
Enumerable#grep_v
El inverso de: Enumerable#grep
devuelve todos los elementos que no coinciden con el argumento dado (en comparación con ===
). Por ejemplo grep
, si se da un bloque, se devuelve su resultado.
(1..10).grep_v 2..5 # => [1, 6, 7, 8, 9, 10]
(1..10).grep_v(2..5){|v|v*2} # => [2, 12, 14, 16, 18, 20]
Hash#to_proc
Devuelve un Proc que produce el valor de la clave dada, que puede ser bastante útil:
h = { N: 0, E: 1, S: 2, W: 3 }
%i[N N E S E S W].map(&h)
# => [0, 0, 1, 2, 1, 2, 3]
Ruby 2.4
Ruby 2.4 aún no está disponible, pero lo estará pronto y tiene algunas características excelentes. (Cuando se publique, actualizaré esta publicación con algunos enlaces a los documentos). Aprendí sobre la mayoría de estos en esta gran publicación de blog .
Enumerable#sum
No más arr.reduce(:+)
. Ahora solo puedes hacer arr.sum
. Toma un argumento opcional de valor inicial, que por defecto es 0 para elementos numéricos ( [].sum == 0
). Para otros tipos, deberá proporcionar un valor inicial. También acepta un bloque que se aplicará a cada elemento antes de la adición:
[[1, 10], [2, 20], [3, 30]].sum {|a,b| a + b }
# => 66
Integer#digits
Esto devuelve una matriz de dígitos de un número en orden de importancia menor a mayor:
123.digits # => [3, 2, 1]
Comparado con, digamos 123.to_s.chars.map(&:to_i).reverse
, esto es bastante bueno.
Como beneficio adicional, se necesita un argumento de raíz opcional:
a = 0x7b.digits(16) # => [11, 7]
a.map{|d|"%x"%d} # => ["b", "7"]
Comparable#clamp
Hace lo que dice en la lata:
v = 15
v.clamp(10, 20) # => 15
v.clamp(0, 10) # => 10
v.clamp(20, 30) # => 20
Como está en Comparable, puede usarlo con cualquier clase que incluya Comparable, por ejemplo:
?~.clamp(?A, ?Z) # => "Z"
String#unpack1
Un ahorro de 2 bytes sobre .unpack(...)[0]
:
"👻💩".unpack(?U) # => [128123]
"👻💩".unpack(?U)[0] # => 128123
"👻💩".unpack1(?U) # => 128123
Argumento de precisión para Numeric#ceil
, floor
ytruncate
Math::E.ceil(1) # => 2.8
Math::E.floor(1) # => 2.7
(-Math::E).truncate(1) # => -2.7
Asignación múltiple en condicionales
Esto genera un error en versiones anteriores de Ruby, pero está permitido en 2.4.
(a,b=1,2) ? "yes" : "no" # => "yes"
(a,b=nil) ? "yes" : "no" # => "no"