>> system 'ls -l c*.rb' -rw-r--r-- 1 casianorodriguezleon staff 296 17 oct 22:12 calif.rb -rw-r--r-- 1 casianorodriguezleon staff 320 26 sep 08:12 case.rb -rw-r--r-- 1 casianorodriguezleon staff 526 10 oct 12:51 chuchu.rb -rw-r--r-- 1 casianorodriguezleon staff 95 7 oct 16:27 closure.rb => true >> files = Dir['c*.rb'] => ["calif.rb", "case.rb", "chuchu.rb", "closure.rb"] >> fs = files.sort { |a,b| File.new(b).mtime <=> File.new(a).mtime } => ["calif.rb", "chuchu.rb", "closure.rb", "case.rb"]
stat
de la clase File
nos permite consultar el estado de un fichero:
>> File.stat("calif.rb") => #<File::Stat dev=0xe000002, ino=29688777, mode=0100644, nlink=1, uid=501, gid=20, rdev=0x0, size=296, blksize=4096, blocks=8, atime=Tue Oct 18 12:17:42 +0100 2011, mtime=Mon Oct 17 22:12:56 +0100 2011, ctime=Mon Oct 17 22:12:56 +0100 2011>Por ejemplo, el método
mtime
permite ver la fecha de la última modificación de un fichero:
>> File.stat("calif.rb").mtime => Mon Oct 17 22:12:56 0100 2011 >> File.stat("calif.rb").mtime.class => Time >> File.stat("calif.rb").mtime.to_i => 1318885976 >> File.stat("case.rb").mtime => Mon Sep 26 08:12:29 0100 2011 >> File.stat("case.rb").mtime.to_i => 1317021149 >> File.stat("case.rb").mtime < File.stat("calif.rb").mtime => true¿Cuales son las salidas de los siguientes comandos?
>> files = Dir['c*.rb'] => ["calif.rb", "case.rb", "chuchu.rb", "closure.rb"] >> sf = files.collect { |f| [File.stat(f).mtime, f] } => [[Mon Oct 17 22:12:56 0100 2011, "calif.rb"], [Mon Sep 26 08:12:29 0100 2011, "case.rb"], [Mon Oct 10 12:51:38 0100 2011, "chuchu.rb"], [Fri Oct 07 16:27:40 0100 2011, "closure.rb"]] >> tf = sf.sort => >> tf.collect { |f| f[1] } =>Esta forma de ordenar un Array según ciertos valores, denominada Schwartzian Transform, consiste en tres pasos:
>> [2,"a"] <=> [2,"b"] => -1 >> [2,"b"] <=> [2,"a"] => 1 >> [2,"b"] <=> [2,"b"] => 0
sort_by
ordena utilizando un conjunto de claves generadas a partir de los valores
usando un bloque dado:
>> %w{apple pear fig}.sort_by { |w| -w.length } => ["apple", "pear", "fig"]Para hacerlo utiliza el algoritmo Schwartzian Transform.
¿Cuál es la salida de esta sentencia?
>> Dir['c*.rb'].sort_by { |f| File.stat(f).mtime } =>
>> h = { :a => 3, :b => 2, :c => 1 } => {:b=>2, :c=>1, :a=>3} >> h.sort_by { |x| x[1] } => [[:c, 1], [:b, 2], [:a, 3]] >> h.sort_by { |x| x[1] }.collect { |z| z[0] } =>
Casiano Rodriguez León 2015-01-07