Você está na página 1de 17

RUBY

Antecedentes
El lenguaje fue creado por Yukihiro "Matz" Matsumoto, quien empez a trabajar
en Ruby el 24 de febrero de 1993, y lo present al pblico en el ao 1995. En el crculo
de amigos de Matsumoto se le puso el nombre de "Ruby" (en espaol rub) como broma
aludiendo al lenguaje de programacin "Perl" (perla). La ltima versin estable es la
1.8.6, publicada en diciembre de 2007. El 26 de ese mismo mes sali Ruby 1.9.0, una
versin en desarrollo que incorpora mejoras sustanciales en el rendimiento del lenguaje,
que se espera queden reflejadas en la prxima versin estable de produccin del
lenguaje, Ruby 1.9.0.1 Diferencias en rendimiento entre la actual implementacin de
Ruby (1.8.6) y otros lenguajes de programacin ms arraigados han llevado al
desarrollo de varias mquinas virtuales para Ruby.
Entre sas se encuentra JRuby, un intento de llevar Ruby a la plataforma Java, y
Rubinius, un intrprete modelado basado en las mquinas virtuales de Smalltalk. Los
principales desarrolladores han apoyado la mquina virtual proporcionada por el
proyecto YARV, que se fusion en el rbol de cdigo fuente de Ruby el 31 de diciembre
de 2006, y se dar a conocer como Ruby 1.9.0.1.

Descripcin

Est orientado a objetos.


Cuatro niveles de mbito de variable: global, clase, instancia y local.
Manejo de excepciones.
Iteradores y clausuras o closures (pasando bloques de cdigo) expresiones

regulares nativas similares a las de Perl a nivel del lenguaje.


Posibilidad de redefinir los operadores (sobrecarga de operadores) recoleccin
de basura automtica.
Altamente portable.
Hilos de ejecucin simultneos en todas las plataformas usando green threads.
Carga dinmica de DLL/bibliotecas compartidas en la mayora de las
plataformas.
Introspeccin, reflexin y meta programacin.
Amplia librera estndar.
Soporta inyeccin de dependencias.

Soporta

alteracin

de

objetos

en

tiempo

de

ejecucin

continuaciones y generadores.

Estructura del lenguaje


La sintaxis de Ruby es similar a la de Perl o Python. La definicin de clases y
mtodos est definida por palabras clave. Sin embargo, en Perl, las variables no llevan
prefijos. Cuando se usa, un prefijo indica el mbito de las variables. La mayor
diferencia con C y Perl es que las palabras clave son usadas para definir bloques de
cdigo sin llaves. Los saltos de lnea son significativos y son interpretados como el final
de una sentencia; el punto y coma tiene el mismo uso. De forma diferente que Python, la
indentacin no es significativa.
Una de las diferencias entre Ruby y Python y Perl es que Ruby mantiene todas
sus variables de instancia privadas dentro de las clases y solo la expone a travs de
mtodos de acceso ( attr_writer , attr_reader , etc.). A diferencia de los mtodos "getter"
y "setter" de otros lenguajes como C++ o Java, los mtodos de acceso en Ruby pueden
ser escritos con una sola lnea de cdigo. Como la invocacin de estos mtodos no
requiere el uso de parntesis, es trivial cambiar una variable de instancia en una funcin
sin tocar una sola lnea de cdigo o refactorizar dicho cdigo. Los descriptores de
propiedades de Python son similares pero tienen una desventaja en el proceso de
desarrollo. Si uno comienza en Python usando una instancia de variable expuesta
pblicamente y despus cambia la implementacin para usar una instancia de variable
privada expuesta a travs de un descriptor de propiedades, el cdigo interno de la clase
necesitar ser ajustado para usar la variable privada en vez de la propiedad pblica.
Ruby elimina est decisin de diseo obligando a todas las variables de instancia a ser
privadas, pero tambin proporciona una manera sencilla de declarar mtodos set y get .
Esto mantiene el principio de que en Ruby no se puede acceder a los miembros internos
de una clase desde fuera de esta; en lugar de esto se pasa un mensaje (se invoca un
mtodo) a la clase y recibe una respuesta.
Estructura semntica
Ruby es orientado a objetos: todos los tipos de datos son un objeto, incluidas las
clases y tipos que otros lenguajes definen como primitivas, (como enteros, booleanos, y
"nil"). Toda funcin es un mtodo. Las variables siempre son referencias a objetos, no
los objetos mismos. Ruby soporta herencia con enlace dinmico, mixins y mtodos
singleton(pertenecientes y definidos por una sola instancia ms que definidos por la
clase). A pesar de que Ruby no soporta herencia mltiple, la clases pueden
importar mdulos como mixins. La sintaxis procedural est soportada, pero todos los
mtodos definidos fuera del mbito de un objeto son realmente mtodos de la clase
Object. Como esta clase es padre de todas las dems, los cambios son visibles para
todas las clases y objetos.

Ruby ha sido descrito como un lenguaje de programacin multiparadigma: permite


programacin procedural (definiendo funciones y variables fuera de las clases
hacindolas parte del objeto raz Object), con orientacin a objetos, (todo es un objeto)
o funcionalmente (tiene funciones annimas, clausuras o closures, y continuations;
todas las sentencias tiene valores, y las funciones devuelven la ltima evaluacin).
Soporta introspeccin, reflexin y meta programacin, adems de soporte para hilos de
ejecucin gestionados por el intrprete. Ruby tiene tipado dinmico, y
soporta polimorfismo de tipos (permite tratar a subclases utilizando la interfaz de la
clase padre). Ruby no requiere de polimorfismo de funciones (sobrecarga de funciones)
al ser dinmicamente tipado (los parmetros de una funcin pueden ser de distinto tipo
en cada llamada, encargndose dicha funcin de determinar el tipo y actuar en
consecuencia).
De acuerdo con las preguntas frecuentes de Ruby, "Si te gusta Perl, te gustar Ruby y su
sintaxis. Si te gusta Smalltalk, te gustar Ruby y su semntica. Si te gusta Python, la
enorme diferencia de diseo entre Python y Ruby/Perl puede que te convenza o puede
que no."
Inclusin de Archivos
Rutas y Directorios
Las rutas son las direcciones que nos indican cmo llegar a un archivo o
directorio en el sistema.
Vamos a ver algunas cosas relativas a la administracin y navegacin entre
directorios.
Primero que nada para el manejo de directorios tenemos la clase del Dir (el vnculo
anterior los lleva a la documentacin), vamos a ver algunas de las funcionalidades que
nos aporta:
Con Dir.pwd podemos

obtener

el

directorio

actual.

Con Dir.chdir("/directorio") podemos navegar al directorio que especificamos en el


string, por ejemplo: Dir.chdir("/home/nia/Descargas") me dejara en el directorio
"Descargas" de mi carpeta personal.
Podemos obtener un array con el contenido de un directorio utilizando
Dir.entries("/directorio").
Si lo que queremos es recorrer o realizar algo (como mostrar) cada uno de los
elementos (archivos o carpetas) contenidos en un directorio sin almacenar un array
podemos utilizar Dir.foreach("/directorio"), por ejemplo:
Dir.foreach("/home/nia/Descargas") do |contenido|
puts contenido
end

Va a mostrar una lista del contenido de mi directorio de descargas en la consola.


Otra forma de obtener un array con el contenido, pero sta vez con el path completo de
cada elemento (y sin los elementos "." ni ".." ) es utilizando Dir["/directorio"].
Utilizando Dir.mkdir("nombre"), creamos en el directorio actual (ese que
obtenemos cuando usamos Dir.pwd) un nuevo directorio con el nombre que le
indiquemos; por defecto se establecen los permisos del directorio como 0777 (osea
lectura/escritura/ejecutabilidad para el dueo y lectura/ejecutabilidad para el grupo y
otros), si queremos asignar uno diferente podemos pasarlo como segundo parmetro:
Dir.mkdir("nombre", intPermiso).
Con Dir.glob("busqueda"), podemos realizar una bsqueda en el directorio
actual, por ejemplo si queremos ver todos los ficheros .zip: Dir.glob("*.zip").
Por ltimo para eliminar un directorio utilizamos Dir.delete("directorio").

Archivos
Una vez entendamos cmo manipular los directorios nos vamos a la gestin de archivos
Como crear un archivo:
Para abrir un archivo simplemente debemos crear un objeto de la
clase File (File.new()) o utilizar el mtodo esttico open (File.open()) y esto nos
devolver un objeto de tipo File al que podremos manipular.
Para acceder a los archivos debemos pasarle un segundo valor por parmetros que nos
indica cmo vamos abrir el archivo. Veamos los parmetros para abrir y crear un
archivo:

r: (slo lectura) Modo por defecto.

r+: (lectura y escritura) Comienza la escritura al principio del archivo.

w: (slo escritura) Borra el contenido del archivo o crea un nuevo archivo para
escritura.

w+: (lectura y escritura) Borra el contenido del archivo o crea un nuevo archivo
para lectura y escritura.

a: (slo escritura) Comienza la escritura al final del archivo si existe y si no crea


uno nuevo.

a+: (lectura y escritura) permite leer y escribir ubicando el cursor al final del
archivo si ste existe y si no crea uno nuevo.

Ejemplo:
#consultamos el directorio donde estamos trabajando
>> Dir.glob "*"
["test"]
#creamos y obtenemos un archivo nuevo
>> archivo =File.new("pruebaCodeHero.txt","w")
File:pruebaCodeHero.txt
#intentamos crear un archivo pasndole por parmetro solo lectura
>> archivo =File.new("pruebaCodeHeroError.txt","r")
Errno::ENOENT: No such file or directory - pruebaCodeHeroError.txt
# consultamos nuevamente la carpeta
>> Dir.glob "*"
["pruebaCodeHero.txt", "test"]

Tipo de Datos y Declaracin


Los tipos de datos son, como su nombre lo indica, los diversos datos que se
pueden almacenar en la memoria usando el lenguaje de programacin Ruby. Como en
todo lenguaje de programacin, se tiene una diferencia en cuanto a estos datos, pues la
cantidad de memoria que usan no es similar, y esta diferencia hace que la distincin
entre unos y otros sea importante.
Nmeros:
En ruby, todo es tratado como un objeto, eso no excluye a los nmeros, en forma
general, ruby cuenta con diferentes clases para manejar cada tipo de nmeros, por
ejemplo:

Integer: La clase base de donde derivan todos los enteros.


Fixnum: Clase para nmeros enteros, su tamao depende de la arquitectura de
donde se interprete el cdigo, sin embargo, su tamao es eso -1 bit y usa
complemento 2 para su representacin en memoria, si un nmero excede el
tamao asignado, automticamente se convierte en bignum.

Bignum: Contiene valores mayores a fixnum, la restriccin depende de la


arquitectura pero pueden guardarse nmeros muy grandes, tanto como de
nuestra memoria, si el nmero ingresado cabe en un fixnum, automticamente se
convierte a esta clase.

Float: Almacena nmeros con punto flotante con la arquitectura de doble


precisin nativa.

Rational: Almacena nmeros racionales, es decir, nmeros con un valor de


numerador y un denominador.

Strings;
Para las cadenas de caracteres, su uso es bastante similar al de cualquier lenguaje
orientado a objetos, con la clase String, sin embargo cabe mencionar algunas
caracteristicas mas emocionantes de ruby, por ejemplo, puedes multiplicar cadenas!
Hola * 5 => Hola Hola Hola Hola Hola
Para una vista ms completa referirse al capitulo de Strings
Date/Time
Ruby ya trae libreras para manejar los tipos date y time, sin embargo para usarlos,
debemos llamar a la librera correspondiente, esto con la palabra reservada require.
require date
Operadores
1. Aritmticos:
Los operadores aritmticos permiten realizar operaciones matemticas, entre dos
variables y/o constantes. Todas las expresiones entre parntesis se evalan primero. Las
expresiones con parntesis anidados se evalan de adentro hacia afuera, el parntesis
ms interno se evala primero. Dentro de una misma expresin los operadores se
evalan en el siguiente orden:
Operador Descripcin
**

Exponencial

*, /, %

Multiplicacin, divisin, modulo

+,

Suma y resta

Ejemplo:
Exponencial
5 ** 2 (el resultado sera 25) 5 ** 3 (el resultado sera 125).
Divisin
5 / 3 = 1 (la operacin nos da como resultado 1, que sera el cociente de una divisin)
Modulo
5 % 3 = 2 (la operacin nos da como resultado 2, que es el resto o residuo de una
divisin)
Los operadores en una misma expresin con igual nivel de prioridad se evalan de
izquierda a derecha.
Ejemplo:
5 * 5 / 6 = 4 (Primero se opera 5 * 5 que seria 25 y despus se divide por 6 y nos dara
4)
6 / 5 * 5 = 5 (Primero se opera 6 / 5 que seria 1 y despus se multiplica por 5 y nos dara
5)
En los dos ejemplos mostrados como los dos operadores tienen el mismo nivel
de prioridad se evalan de izquierda a derecha dndonos diferente resultado en dos
operaciones aparentemente iguales.
2. Relacionales:
Los operadores relacionales comparan valores entre s, el resultado es verdadero
o false (uno o cero).

Operador

Descripcin

==

igual que

!=

diferente de

<

menor que

>

mayor que

<=

menor o igual que

>=

mayor o igual que

El operador == (igual que) es solo para realizar comparaciones, si deseamos asignar un


valor a una variable debemos utilizar el operador = (igual)
Ejemplo:
a = 16
b = 61
a

==

(el

resultado

sera

falso,

porque,

16

no

es

igual

que

61)

a = b (el resultado de la variable a, ahora es 61, porque, se le ha asignado el valor de b)


3. Lgicos:
Los operadores lgicos se utilizan para comparar dos expresiones y devolver un
resultado booleano (verdadero o falso). Estos operadores unen estas expresiones
devolviendo tambin verdadero o falso.
Operador

Descripcin

&&, and

||, or

No

Las expresiones conectadas con operadores && y || se evalan de izquierda a


derecha y la evaluacin se detiene tan pronto como el resultado verdadero o falso es
conocido.
Declaracin e inicializacin de variables

En Ruby no hay una declaracin explcita del tipo de dato de una variable. El
mismo se determina en tiempo de ejecucin a partir del valor que se le ha asignado.
Esto significa que las variables pueden tomar diferentes tipos de datos en diferentes

partes del programa. Para determinar si un nombre hace referencia a una variable o a un
mtodo, Ruby utiliza heurstica, en la cual a medida que va leyendo el cdigo fuente va
llevando control de los smbolos que ha ledo, asumiendo que los mismos son variables.
Cuando se encuentra con un smbolo que puede ser una variable o un mtodo, revisa si
ya se le ha asignado algo anteriormente. Si es as, entonces lo trata como variable; si no,
lo trata como un mtodo.
Ejemplo:

#declaracin de una variable de tipo String


Nombreclase = Lenguajes de Programacin
#declaracin de una variable de tipo entero
Numeroalumnos = 30
#declaracin de un arreglo
numeros = [ 3, 4, 12, 22.5 ]

Sentencias de control Condicional


Ruby ofrece diferentes estructuras de control que nos permiten alterar el flujo de
la ejecucin del programa, entre ellas podemos destacar:
IF: La estructura de control IF, maneja el flujo de la aplicacin dependiendo del
resultado de una condicin.
Siguiendo con nuestro ejemplo del "juego RPG", cuando nuestro player est muerto
debemos realizar una accin, por lo general descontar un contine y renacer en el ltimo
punto guardado.
Primer archivo: prueba_if.rb
#!/usr/bin/ruby

vida = 100
continues = 3

# pasan cosas que nos quitan vida

if vida == 0
puts "El Personaje ha muerto"
puts "Tu personaje va a revivir"
continues = continues - 1
else
puts "El juego continua con normalidad"
end

# En caso de necesitar el else if en ruby se usa la siguiente sintaxis


numero = 3

if numero > 5
puts "#{numero} es mayor que 5"
elsif numero == 3
puts "#{numero} es igual a 3"
else
puts "#{numero} es menor que 5 pero no es igual a 3"
end

Para correr el script desde la consola


ruby ~/Desktop/prueba_if.rb

El juego continua con normalidad


El nmero es igual a 3

UNLESS: La estructura de control UNLESS, es similar a el IF en cuanto a


estructura pero solo ejecuta el cdigo si no es igual a la condicin (==FALSE)
#!/usr/bin/ruby

numero = 1
unless numero == 1
puts "El nmero no es el 1"
else
puts "El nmero es el 1"
end
La respuesta en este caso sera:
ruby ~/Desktop/prueba_unless.rb

El nmero es el 1

CASE: En caso de tener una variable que necesitamos comprobar muchos casos,
en vez de usar muchos if con elsif, seria mas natural usar la expresion case

case variable
when [condicion]
# code
when [condicion]
# code
else
# code
End

Un ejemplo ms claro del uso del case pude ser:


#!/usr/bin/ruby

edad = 5
case edad
when 0 .. 2
puts "Bebe"
when 3 .. 12
puts "Nio"
when 13 .. 18
puts "Adolescente"
else
puts "Adulto"
end

Sentencias de Control Repetitivas

BUCLES: Bucles de Ruby se utilizan para ejecutar el mismo bloque de cdigo


una cantidad especfica de veces. En este captulo se detallan todas las
sentencias de bucles apoyados por Ruby. Es importante tener cuidado con los
bucles y asegurarse que la sentencia de parada se ejecute al menos una vez, para
evitar bucles infinitos que bloqueen el sistema.
WHILE: Estos bucles o ciclos se ejecutan hasta que la condicin sea verdadera.
Para empezar debemos conocer la sintaxis:
while conditional [do]
code
end

Para comprender mejor estos bucles lo demostraremos con un ejemplo fcil:


#!/usr/bin/ruby
numero = 0
while numero < 5 do
puts("el nmero es: #{numero}" )
numero = numero +1
end
Y el resultado de este Script es una recorrida por los nmeros desde el 0 hasta que se
cumpla la condicin de parada, que es cuando el nmero sea menor a cinco.
$ ruby Desktop/conditionalCodehero.rb
el nmero es: 0
el nmero es: 1
el nmero es: 2
el nmero es: 3
el nmero es: 4
REPEAT: Estos bucles se ejecutan siempre al menos una vez, ya que entra en el
bloque de cdigo y al final se verifica la condicin de salida. La sintaxis de este
tipo de bucles es:

cdigo while condicin


O de la siguiente manera:
begin
cdigo
end while condicin
Para demostrar el funcionamiento de estos tipos de bucles, veamos este ejemplo:
#!/usr/bin/ruby

numero = 0
begin
puts("el nmero es: i = #{numero}" )
numero +=1
end while numero < 5
Ejecutamos el Script obteniendo lo siguiente como resultado:
>> ruby Desktop/conditionalCodehero.rb
el nmero es: i = 0
el nmero es: i = 1
el nmero es: i = 2
el nmero es: i = 3
el nmero es: i = 4

UNTIL LOOP: Este tipo de loop se ejecuta hasta que la condicin de parada
sea falsa, la sintaxis se define de la siguiente manera:
until Condicin [do]
cdigo
end
Lo demostramos con el siguiente ejemplo, en donde el bloque de cdigo interno al
bucles se ejecuta mientras el nmero no sea mayor que cinco:
#!/usr/bin/ruby
numero = 0
until numero > 5 do
puts("El nmero es #{numero}" )
numero +=1

end
El resultado de este Scripts es:
ruby Desktop/conditionalCodehero.rb
El nmero es 0
El nmero es 1
El nmero es 2
El nmero es 3
El nmero es 4
El nmero es 5
FOR: Estos bucles se ejecutan una vez por cada elemento. stos tienen
configurado un rango de valores que indican cuantas veces se va a ejecutar.
Primero les definimos la sintaxis para posteriormente ir con el ejemplo y
comprender mejor esto:
for variable [, variable ...] in expresin [do]
Cdigo
end
En el ejemplo vamos a poder ver como la variable simplemente incrementa sola, hasta
cumplir con la expresin que en este caso es un objeto de tipo Rango con valores desde
el 0 hasta el 3:
#!/usr/bin/ruby

for i in 0..3
puts "El valor de la variable es: #{i}"
end
Dando como resultado lo siguiente:
$ ruby Desktop/conditionalCodehero.rb
el valor de la variable es: 0

el valor de la variable es: 1


el valor de la variable es: 2
el valor de la variable es: 3
Definicin de funciones y arreglos
Las funciones: se definen por la palabra clave def.
def hola(programador)
puts "Hola #{programador}"
end
hola('Pepe')

# Hola Pepe

Los Arrays: Se pueden crear un array listando elementos entre corchetes ([ ]) y


separndolos por comas. Los arrays en Ruby pueden almacenar objetos de diferentes
tipos.
ruby> ary = [1, 2, "3"]
[1, 2, "3"]
Los arrays se pueden concatenar y repetir, igual que las cadenas.
ruby> ary + ["foo", "bar"]
[1, 2, "3", "foo", "bar"]
ruby> ary * 2
[1, 2, "3", 1, 2, "3"]
Se pueden utilizar ndices numricos para acceder a cualquier parte del array.
ruby> ary[0]
1
ruby> ary[0,2]
[1, 2]
ruby> ary[-2]
2
ruby> ary[-2,2]
[2, "3"]
ruby> ary[-2..-1]
[2, "3"]
(Los ndices negativos indican que se empieza a contar desde el final del array, en vez
del principio). Los arrays se pueden convertir a y obtener de cadenas utilizado join y
split respectivamente:
ruby> str = ary.join(:)
"1:2:3"
ruby> str.split(:)

["1", "2", "3"]

Você também pode gostar