Hashes para Argumentos con Nombre

Es difícil recordar el orden de los argumentos de un método que requiere mas de tres argumentos. Cuando el número de argumentos es grande, haremos que los argumentos se empaqueten en un hash. Este es un ejemplo:

~/rubytesting$ cat -n shell.rb 
     1  
     2  def ls(args) 
     3    hidden    = args[:hidden]?    '-a' : ''
     4    dir       = args[:dir]?       '-d' : ''
     5    reverse   = args[:reverse]?   '-r' : ''
     6    time      = args[:time]?      '-t' : ''
     7    recursive = args[:recursive]? '-R' : ''
     8    regexp    = args[:regexp] || Regexp.new('.')
     9  
    10    files = %x{ls #{hidden} #{reverse} #{dir} #{recursive} #{time} 2>&1}.split(/\n/)
    11    files.select { |f| f =~ regexp }
    12  end
    13  
    14  puts  ls(:reverse =>1, :time => 1, :regexp => /^m/)
    15  puts  '***********************************************'
    16  puts  ls(:hidden =>1,  :regexp => /^.[ms]/)
Podríamos haber llamado a ls así

    ls({:reverse =>1, :time => 1, :regexp => /^m/})

Pero ruby nos permite omitir las llavitas cuando el último argumento del método es el hash (o si es el único argumento que le sigue es un argumento bloque prefijado de &). Un hash sin llaves se denomina bare hash.

    ls(:time => 1, :reverse =>1, :regexp => /^m/)

Es posible también omitir los paréntesis en la llamada:

puts  ls :hidden =>1,  :regexp => /^.[ms]/
Si se omiten los paréntesis se deberán también omitir las llaves ya que si unas llaves siguen a un nombre de método Ruby lo interpreta como que estamos pasando un argumento de tipo bloque.

Ejecución:

~/rubytesting$ ruby shell.rb 
myutf.rb
methodmethod.rb
memoize
map2funcWithLambdas.rb
map2func.rb
***********************************************
.myutfstring.rb.swp
.shell.rb.swp
.svn
useGreeter.rb
useSudoku.rb

Casiano Rodriguez León 2015-06-18