Conociendo a Ruby
Ruby es un lenguaje puramente orientado a objetos. Para los que no conozcan sobre programación orientada a objetos (POO), tal vez deberían leer un poco más al respecto. Sin embargo, aún sabiendo las características de la POO a veces se puede dificultar un poco familiarizarse con ruby, digamos que es tán fácil que se dificulta (principalmente para los que vienen de lenguajes como C#, Java o PHP).
En el siguiente artículo se explicarán algunas de las características nuevas que se puedan presentar al programar en ruby por primera vez.
Ruby es un lenguaje interpretado, es decir que no se necesita compilar antes de ser ejecutado. Todo el código se valida en tiempo de ejecución.
Para correr los ejemplos que se encuentran en este artículo (y en todos los que sean específicos de ruby) puedes hacerlo de dos formas:
- IRB (Interactive Ruby). Es la manera más fácil de jugar con ruby, una vez instalado en tu computadora simplemente ejecuta ‘irb’ (en símbolo del sistema o terminal). Ahora puedes escribir expresiones ruby como si fuera un documento normal, sólo que cada sentencia/bloque se ejecutará al momento. Por ejemplo:
irb(main):001:0> class Hello irb(main):002:1> def say irb(main):003:2> puts "hola mundo" irb(main):004:2> end irb(main):005:1> end => nil irb(main):006:0> Mundo.new.say => hola mundo => nil irb(main):007:0> puts "hey, esto es muy sencillo!" hey, esto es muy sencillo! => nil irb(main):008:0> 2 + 5 => 7
- Scripts. Puedes copiar el código directamente en un archivo con extensión .rb y luego simplemente ejecutarlo con ruby mi_script.rb
Se recomienda la opción del IRB para mayor fácilidad.
Clases
Las clases en ruby son casi como cualquier clase en otros lenguajes: agrupan funcionalidades, encapsulan lógica, etc, etc, etc… Sin embargo una cualidad en ruby es que las clases nunca se cierran, puedes reabrir una clase para modificarla y ésta mantendrá las definiciones anteriores.
class Mundo
def hola
puts "hola mundo"
end
end
mi_mundo = Mundo.new
mi_mundo.hola # => "hola mundo"
class Mundo
def adios
puts "adios mundo"
end
end
mi_mundo.adios # => "adios mundo"
Como se ve en el ejemplo anterior, un objeto se crea llamando al método new de la clase, el cual a su vez llama al método initialize si se encuentra para inicializar variables. Initialize es como un constructor para la clase.
class Person
def initialize(name, age)
@name = name
@age = age
end
def name
@name
end
end
p = Person.new("Edgar", 20)
p.name # => "Edgar"
Esos identificadores con arrobas son variables de instancia. Para no entrar mucho en detalle, las variables de instancia están disponibles para toda la clase por eso en el método ‘name’ se regresa el valor que se le había asignado en el método ‘initialize’. Estas variable juegan un papel importante en rails ya que están disponibles también en el ámbito de las vistas. Por ejemplo, si en un controlador declaramos una variable de instancia, ésta estará mantendrá su valor en la respectiva vista. Más adelante ya se entendrá mejor.
Símbolos
Los símbolos no tienen una definición conscisa, pero podemos decir que son representaciones de cadenas. Los símbolos empiezan con dos puntos :simbolo, los cuales pueden ayudar a definir lo que es un símbolo: si decimo que los dos puntos significa "la cosa llamada…" entonces sería más fácil entender lo que son los símbolos. Por ejemplo :name sería algo como "la cosa llamada… name".
La razón de ser de los símbolos es principalmente disminuir la duplicación. Podemos usarlos como cadenas por lo que si repites una cadena muchas veces en tu aplicación sería mejor utilizar símbolos.
Cómo los símbolos no pertenecen oficialmente a un tipo (en realidad sí, son objetos de la clase Symbol pero no nos haremos bolas), suelen usarse como llaves para los hashes… ah! y qué son los hashes?
Hashes
Los hashes (o diccionarios) son contenedores más o menos como los arrays, pero en vez de estar indexados por índices numéricos, se componen de un valor con su respectiva llave (de cualquier tipo). Podrían entenderse un tanto como listas.
mi_hash = {:name => "Edgar", :age => 20}
mi_hash[:name] # => "Edgar"
mi_hash["country"] = "mx"
mi_hash[10] = "diez"
mi_hash #=> {"country" => "mx", :name => "Edgar", :age => 20, 10 => "diez"}
un_array = ['uno', 'dos', 3]
un_array[0] # => "uno"
Bloques
Los bloques son un tema muy extenso, sin embargo este artículo es sólo una introducción a lo nuevo por lo que sólo se abordarán los aspectos más relevantes.
Un bloque es… un iterador.
3.times { |i| puts i } # => 0 1 2
['uno', 'dos', 'tres'].each do |i|
puts i
end # => uno dos tres
Un bloque lo que hace es iterar cada uno de sus elementos y ejecutar el código declarado para cada uno.
def tres_veces
yield
yield
yield
end
tres_veces do
puts 'hey '
end # => hey hey hey
def dos_o_nada
if block_given?
yield
yield
else
'nada'
end
end
dos_o_nada # => 'nada'
dos_o_nada { puts 'algo ' } # => algo algo
yield "embebe" (podría verse de esa forma para entenderse mejor) el código que se pasa como parámetro.
Como dije, el tema de los bloques es extenso y no lo explicaré esta vez (más adelante en un post dedicado sólo a bloques)… pero les dejo algo para pensar un rato
class Bloques
def guardar_accion(&block)
@b = block
end
def hacer_accion
@b.call
end
end
b = Bloques.new
b.guardar_accion { puts 'O_o' }
b.hacer_accion # => O_o
Hasta aquí la primera parte de Conociendo a Ruby. Espero que esto sea de ayuda para quienes apenas comienzan. Y para los que ya tienen algo de experiencia no se desesperen, pronto llegaremos a temas más avanzados e interesantes.
