cachilax
Usuario (Argentina)
Hola gente, como va todo? Les traigo la propuesta de este taller, en el que les voy a ir intentando enseñar algo de Ruby, bien desde 0, o mejor dicho, desde -1. Osea que estaria bueno que los que nunca vieron algo de programacion, y quieran aprender se enganchen con esto, ya que les voy a explicar toooodo como si nunca en su vida hubieran tocado una PC. Les paso a explicar masomenos como me voy a manejar en el taller, asi se van haciendo una idea aproximada de como vamos a trabajar. Siempre les voy a explicar que estamos haciendo, osea, que entinedan lo que hacen uds, porque sino no tiene gracia, o eso me parece a mi, sino van a terminar copiando y pegando lo que yo haga y lo van a modificar masomenos como para que ande, y asi no va che! xD Bueno... me dejo de vueltas, y empesamos con el.... Taller de Ruby Primero que nada tienen que saber que es Ruby. Ruby es, en lineas generales un lenguaje de programacion orientado a objetos, que es muy sencillo. Fue diseñado para que sea facil de leer y escribir. No se compila, es por eso que es un lenguaje de guiones o Scripts que es interpretado por un Interprete (en este caso el interprete de Ruby) para ser ejecutado en tu computadora. Bueno, antes de seguir quiero que vean que es lo que vamos a necesitar por ahora para el taller. 1) Se van instalando el Ruby para Windows, yo voy atrabajar usando la version disponible en http://rubyforge.org/frs/?group_id=167 yo estoy usando la version 1.8.6-26 Final Release. Este paquete (que ya se me estan bajando e instalando) contiene el interprete Ruby y un editor de texto llamado Scite, entre otras utilidades, sobre los cuales nos vamos a centrar casi totalmente para los ejemplos y contenidos que aprendamos en este taller. Sepan que vamos a utilizar el Scite como "IDE" para programar en Ruby, aunque no sea un IDE de ruby en si, sino un editor de textos. Ahora si, una vez instalado todo, vallan a Inicio----> Todos los programas----> Ruby 186-26----->Scite. Se van a encontrar con algo como esto: Este es el famoso editor de texto del que les hablaba, con elque van a crear obras maestras-...... dentro de unas cuantas clases xD. Les muestro una parte de codigo asi la analisamos y la ejecutamos asi ven como vamos a trabajar a lo largo del taller =) Escriban en el editor: puts 'Hola' Ahora, para poder ejecutar el programa primero deben guardarlo en su disco, con la extension *.rb, que es la que tienen todos los scripts de Ruby. Asi que nos vamos a File--->Save As o apretamos Control+S y guardamos el archivo donde queremos (yo les recomiendo que guarden este y todos los archivos del taller en una misma carpeta, bien identificada, asi ganan orden y un acceso mas facil para despues no tener que ir buscando los archibos por la PC --Bajon!--) pero con la extension *.rb. Por ejemplo puts.rb Una vez que lo guardaron con la extension *.rb el Scite habra reconocido este archivo como un script de Ruby por eso ahora podemos ejecutarlo para ver como anda Asi que presionen F8, y veran que a la derecha aparecera otra ventana de fondo blanco, en la quen o van a poder escribir. Esta "nueva ventana blanca" recibe el nombre de terminal y es donde se ejecutaran todos sus scripts. Ahora solo resta ejecutar el script, presionando F5 o llendo a Tools--->Go. Para limpiar esta terminal apreta las teclas Shift+F5 ya que cuando ejecutes varios scripts siempre quedan sus respectivas salidas en esa terminal. Cuando ejecutes el script tendrias que obtener algo asi en tu terminal: >ruby puts.rb Hola >Exit code: 0 Buenisimo. La sentencia puts sirve para mostrar strings (string= cadena de texto) en pantalla, si lo pensas te das cuenta puts = put string = poner cadena de texto. Espero que me vallan siguiendo, cualqueir cosa me preguntan Numeros y operaciones en Ruby En ruby, tenemos distintos tipos de datos que, a grandes rasgos, podemos identificar como Strings (o cadenas de texto) y Numericos. Estos ultimos, los subclasificamos por tipo, y distinguimos a los Enteros y los Reales (tambien llamados de Coma Flotante o Float) que serian los Reales Decimales. Para trabajar con numeros, hacemos uso de los Operadores Aritmeticos que nos permiten realizar las operaciones mas comunes, como la suma( + ), la resta( - ), division( / ) y multiplicacion( * ). Ahora vamos a ver unos ejemplos para que entiendan mejor como trabajar los numeros con Ruby. #Sumar dos numeros y mostrarlos en pantalla: puts 4 + 4 #Restar dos numeros y mostrarlos en pantalla: puts 6 - 3 #Multiplicar dos numeros y mostrarlos en pantalla: puts 8 * 2 #Dividir dos numeros y mostrarlos en pantalla: puts 3 / 2 Nota: las lineas antecedidas por el simbolo # son comentarios, es decir que esas lineas seran ignoradas por el interprete. Esto es util, por ejemplo cuando queremos describir que hace un pedazo de codigo, o comentar algunas lineas del mismo codigo, para que no sean interpretadas, etc,etc. Fijense que cuando ejecuten este codigo, les dara como resultado >ruby operadores.rb 8 3 16 1 >Exit code: 0 Si lo leen, se daran cuenta que la division de 3 con 2, dio como resultado 1 y no 1.5. Esto es porque los numeros 3 y 2 son numeros Enteros. Para que el resultado sea 1.5 , tendriamos que haber puesto 3.0 divido 2, ya que el 3.0 es un numero decimal o de coma flotante. Hagan la prueba y veran que: puts 3.0 / 2 Nos devolvera 1.5 de resultado Operador Mod ( % ) El operador Mod, calcula el resto de una division entre dos numeros. Un ejemplo de su uso: puts (5 % 3) # muestra '2' en la salida Ejecutenlo y veran que nos devolvera el valor 2 Potencia de un numero ( ** ) Ruby, tambien nos facilita el operador ** que sirve para calcular la potencia de un numero. Por ejemplo, si queremos calcular 3 al cuadrado y 2 al cubo: puts 3 ** 2 puts 2 ** 3 Así de facil muchachos Variables en Ruby Bueno, como ya sabran algunos y otros no, basicamente las variables son dates que, como indica su nombre, pueden variar durante la ejecucion de un programa, ya sea asignandoles un valor y luego otro, o modificando con algun operador esos valores, etc,etc. Estas variables, si bien pueden cambiar el valor de sus datos, siempre mantienen el mismo tipo de datos, es decir que una variable numerica, será siempre numerica a lo largo del programa. En Ruby, el valor a las variables se asigna así: # Defino una variable tipo string: miString = 'Viva Taringa y Caught In My Net' # Defino una variable tipo entera: miEntero = 1432 # Defino una variable tipo Real o Decimal: miReal = 4,5 miReal2 = 4.0 #si pusieramos miReal2 = 4 seria un Entero y no un Decimal o Real # Definicion de una Constante (El nombre de una constante debe ser escrito TOTALMENTE en MAYUSCULAS): CONSTANTE = 5.3 Nota: Sepan que Ruby es "case sensitive" osea que discrimina entre mayusculas y minusculas, por lo cual no seria igual la variable miReal que miREAL. Así que tengan cuidado y acuerdense y fijense como escriban las variables. Si prestaron atencion, acaban de ver ejemplos de como declarar variables y constantes, recuerden que estas ultimas deben llevar el nombre escrito totalmente en mayusculas, sino Ruby las reconocera como Variables. Tambien observen que a diferencia de otros lenguajes, en Ruby no es necesario declarar que tipo de datos va a almacenar cada variable, ya que Ruby se da cuenta por la forma en la que van declarando las mismas variables, así que resumiendo no se olviden de que: - Los valores asignados a un string van entre apostrofes ( ' ). - Las constantes se van a definir EN MAYUSCULAS, de lo contrario será una variable. - Los enteros no llevan punto decimal, sino serian definidos como Reales o Decimales Metodos To_i, To_f y To_s Estos metodos nos permiten convertir una variable a distintos tipo de datos: To_i : Convierten en un Entero (en ingles Integer) To_f : Convierten en un Decimal (en ingles Float) To_s : Convierten en un String. Por ejemplo, vamos a definir una variable como string y la convertiremos en Entera, y luego la vamos a convertir a Decimal. #Defino el string y luego le asignaremos ese valor convertido en entero a una variable entera: miString = '1991' #Convierto miString en entero y se lo asigno a la variable miEntero: miEntero = miString.to_i #Convierto miEntero en Decimal / Real y lo asigno a la variable miReal: miReal = miEntero.to_f #Imprimo en pantalla los tres valores de las variables: puts miReal, miEntero, miString Lectura de Datos En las "capitulos" (?) anteriores, usamos el comando "puts", para mostrar los datos en pantalla. Estos datos, etan definidos por nosotros, dentro del programa, es decir que no eran ingresados en el momento de ejecucion del script. Ahora vamos a ver como tomar datos durante la ejecucion de un programa, es aquí donde gets (get= obtener s=string ) y el metodo chomp nos simplificaran la existencia xD. Por ejemplo, vamos a pedir que el usuario ingrese una edad por teclado, se la asignaremos a una variable y luego mostraremos el valor de esa variable en pantalla: #ejemplo de Gets y Chomp puts "¿Que edad tenes?" STDOUT.flush edad = gets.chomp puts "Su edad es: " + edad +" años" Nota: Cuando ejecutes el codigo del ejemplo de Gets y Chomp tendras que hacer clic en la ventana de output (la salida) del SciTE ya que el programa va a estar esperando que ingreses tu edad, si no lo haces el programa no va a continuar hasta que ingreses una edad. Si vieron atentamente el codigo se daran cuenta que hay una CONSTANTE llamada "STDOUT" que yo nunca inicializé (es decir, no le asigne ningun valor ni la definí). Esta constante es una constante interna de Ruby, que almacena todas las salidas del programa. STDOUT.flush El flush es un metodo que lo que hace es limpiar STDOUT para que no quede con basura de salidas anteriores, es decir que siempre tenes que uzarlo antes de tomar un valor. edad = gets.chomp Esta linea de codigo lo que hace es asignar a la variable "edad" el resultado del gets. Cuando vos tomas un valor con gets, Ruby automaticamente le agrega al final el "\n" que es el salto de linea, lo que hace el chomp es eliminar ese "\n" almacenado en el gets, asi que no te olvides de ponerlo!. Les pongo otro ejemplo así pueden entender mejor lo del STDOUT. Con este programa vamos a tomar 2 numeros por teclado, y vamos a sumarlos para luego calcular su promedio. # Promedio de dos numeros puts "Ingrese el primer numero: " STDOUT.flush numeroA = gets.chomp puts "Ingrese el segundo numero: " STDOUT.flush numeroB = gets.chomp promedio = numeroA.to_i+numeroB.to_i puts "El promedio de los dos numeros es: ", promedio /2 Si se fijan, aqui para poder operar con los numeros, tube que convertir los datos ingresados en Enteros (Integers), ya que, como indica su nombre, gets, toma todos los valores como STRINGS. Es por eso que tube que convertir con el metodo to_i numeroA y numeroB para que sean enteros. Bueno ahora que ya saben variables simples, operaciones con numeros y variables, saben leer datos por teclado, saben constantes, saben los tipos de datos con los que nos podemos encontrar, etc. Les voy a dejar algunos ejercicios para que practiquen, y retengan mejor la sintaxis y lógica. 1) Hagan un programa que, ingresado un numero por teclado correspondiente a horas, calcule a cuantos minutos equivale. 2) Hagan un programa que pida ingresar 5 numeros, y luego calcule su promedio. Recuerden convertir todos los numeros con to_i o to_f para poder hacer operaciones. Métodos: Manipulación de objetos Para Ruby, todo es un objeto (más adelante voy a dedicar todo un capitulo a objetos y programacion orientada a objetos, así que, no se preocupen si no entienden ahora) , desde las variables (un string, etc) hasta los objetos definidos por el programador. Entonces, que es un metodo ? un metodo es lo que nos permite manipular un objeto. Por ejemplo, definimos la variable "a" como String (que en Ruby es tomada en cuenta como un objeto) y luego usamos el metodo length para obtener su longitud: a = 'Esta cadena tiene 31 caracteres' puts a.length Esto nos va a dar por salida el numero "31", que es la longitud de carácteres (de la A a la Z + a ala z + 0 al 9+ el "_" -guion bajo- + el " " -espacio en blanco). El metodo length es un metodo predefinido por Ruby, es decir, que no lo definimos nosotros mismos. Mas adelante vamos a ver como definir uno nosotros, manualmente. Metodos Bang (!) Y te estaras pregutnando que ***** es un metodo bang ? Un metodo Bang, es un metodo que no devuelve o muestra el valor de un objeto, sino que lo modifican. Llevan ese nombre, ya que se los considera peligrosos, por su capacidad de modificar directamente en el objeto. ¿Como distinguimos en el codigo un metodo bang de uno que no lo es ? Un metodo bang, siempre lleva al final de su nombre un "!" que hace que modifique al objeto. Veamos un ejemplo, para que quede mas claro: #Definimos la variable "a", como string, y la lleno con #una parte de una cancion de Megadeth xD (Trust) a = "We lie to each other so much" #Aclaro que el metodo "upcase" es para ver el valor de un string convertido en mayúsculas. #Usamos el metodo "comun" (no bang), por lo tanto el objeto no se modifica: b = a.upcase puts b puts a #Usamos un metodo bang (con "!" al final), en consecuencia la propiedad del objeto se modifica y el string queda convertido TOTALMENTE en mayúsculas: c = a.upcase! puts c puts a Pensando en Objetos Bueno, tanto que prometi hablar de objetos, y acá estamos. Cuando entiendan lo expuesto en este capitulo, van a entender mejor lo referente a Métodos, y cuales son las utilidades de los mismos. Ademas, esto va a cambiar ampliamente la forma en que se planteen la programacion, ya que van a poder hacer POO (Programacion Orientada a Objetos). Cuando hablamos de POO, hablamos entre otras cosas, de: - Abstraccion. - Encapsulamiento. - Herencia. - Polimorfismo. - Acoplamiento. La abstracción La abstracción, cuando nos referimos a POO, es la capacidad de poder abstraer las propiedades y comportamientos comunes para poder representar un objeto. Por ejemplo, supongamos que vamos a representar un alumno como objeto, entonces si bien todos los alumnos son diferentes, (algunos altos, otros enanos, rubios, morochos, etc) tenemos que abstraernos a las propiedades y comportamientos que los hacen alumnos, y que tienen en comun entre ellos, entonces podremos reconocer que todos los alumnos: - Van a una escuela determinada. - Tienen materias. - Tienen un numero determinado de las mismas. - Aprueban y Desaprueban sus materias. - Tienen una calificacion, etc. Encapsulamiento Esto significa, que las propiedades de cada objeto son privadas (propias del objeto) y ajenas a los demas objetos. Ademas, solo se puede acceder a ellas por Métodos (como vimos en el capitulo anterior), que pueden ser publicos o privados Al poner en practica estos conceptos desarrollando un objeto, no nos va a interesar su funcionamiento interior, sino sus "productos" es decir, lo que hace, lo que nos regresa. Herencia Cuando se crean objetos nuevos a partir de otros existentes, estos van a heredar las propiedades y comportamientos de sus "antecesores" por decir de algun modo. Hay solo dos tipos de herencia: la Herencia Simple y la Herencia Múltiple. La herencia es muy usada cuando hacemos POO ya que se puede especificar el comportamiento de las clases hijas, lo cual nos deja un mejor diseño en el sistema Polimorfismo El polimorfismo es la capacidad del objeto de tener métodos con el mismo nombre, pero con comportamientos diferentes. Esto es conocido tambien como sobre escritura de métodos. Acoplamiento Es la medida en que un objeto depende de otro u otros, y mientras menor sea este acoplamiento, mejor. Espero que les halla servido, y disculpenme, que les halla puesto esta parte tan "teorica y nada práctica" pero va a ser necesario que lo entiendan, y sepan para poder entender bien la POO, ya que Ruby es un lenguaje orientado a objetos. Ahora si, podemos seguir. ¿Que es una clase? Partamos de que un objeto es un contenedor de datos y que a la vez controla el acceso a los mismos. Encadenados a los objetos, se encuentran los Atributos, que definen sus caracteristicas. Y luego estan los Métodos, los cuales son como una "interfaz" para poder acceder o mejor dicho, interactuar con el objeto. Las clases se utilizan para construir un objeto. Es decir, que vendrian a ser una especie de "molde" para hacer objetos. Y cada objeto seria una instancia de la clase es facil. Bueno... y resumiendo: ahora ya saben que es un método, que es un objeto, saben en que consiste la POO y saben que es una clase. Así que no van a tener problemas para entender el siguiente ejemplo, donde vamos a definir una clase, sus metodos, y objetos, para que puedan aplicar tooodo lo aplicado =). #Definimos la clase Perro: class Perro #"Inicializamos" la clase con el metodo initialize: def initialize(raza, nombre, edad) #Aquí van los atributos de la clase @raza = raza @nombre = nombre @edad = edad end #Fin del método initialize #Creamos el método ladrar def ladrar puts 'Guau Guau' end #Fin del método ladrar #Creamos el método saludar def saludar puts "Soy un perro de la raza #{@raza} y mi nombre es #{@nombre} y mi edad es #{@edad}" end #Fin del método saludar end #Final de la clase # Creo el objeto "a" de la clase "Perro" con el metodo new #y paso los valores como en el método "initialize(raza, nombre, edad)" #de cuando definimos la clase perro. a = Perro.new('siberiano','pancho','16') #Hacemos uso del método saludar, del nuevo objeto "a" a.saludar #Hacemos uso del método saludar, del nuevo objeto "a" a.ladrar Lean el codigo, que en el mismo, está todo explicado, ya que puse comentarios para que puedan entenderlo bien . Aclaraciones Cuando usamos #{@raza} por ejemplo en: puts "Soy un perro de la raza #{@raza} y mi nombre es #{@nombre} y mi edad es #{@edad}" estamos haciendo referencia al atributo raza que definimos en initialize cuando incializamos la clase, el cual recibe un valor cuando creamos el objeto: a = Perro.new('siberiano','pancho','16') siberiano sera el valor del atributo raza pancho sera el valor del atributo nombre 16 sera el valor del atributo edad Porque definimos que serian ingresados así, en ese orden, cuando hicimos initialize(raza, nombre, edad) Y así fue que los recibieron cuando creamos el objeto: a = Perro.new('siberiano','pancho','16') Cualquier duda que tengan, peguen un chifle, y yo se las respondo aca mismo en T! Espero que les halla gustado, porque me sacó mucho esfuerzo, ademas lo escribi toooodo yo Criticas, agradecimientos, etc son bienvenidos Saludos genteeeee!!! Cachilax