Overblog Seguir este blog
Edit post Administration Create my blog
4 febrero 2014 2 04 /02 /febrero /2014 23:08

Bueno este tema es bastante sencillo, en Ruby se puede trabajar con Rangos que es una indicación de una cantidad de elementos, con ellos se pueden hacer muchas cosas:

 

Tipos de rangos

 

Incluyendo el último elemento

 

irb(main):001:0> 1..2

=> 1..2

irb(main):002:0> (1..2).class

=> Range

 

En este caso se puede ver que para indicar un rango se usa 2 puntos seguidos ( .. ) y en los extremos se ponen los valores, en este caso en la línea 1 se indica un rango del 1 hasta el 2 contando el 2, es decir que tenemos 2 elementos el 1 y el 2, luego para poder conocer las propiedades del rango, este debe encapsularse en paréntesis, porque sino sería trivial, si no le ponemos quedaría 1..2.class entonces Ruby entendería que deseamos crear un rango desde 1 hasta 2.class que sería Fixnum osea 1..Fixnum, lo cual daría un error, al encerrarlo en paréntesis tambien podemos colocar el Rango en una variable, ya que también el rango es un objeto.

 

Sin incluir el último elemento

 

Ahora hay que diferenciar del otro tipo de rango con 3 puntos:

 

irb(main):006:0> 1...2

=> 1...2

irb(main):007:0> (1...2).class

=> Range

 

Muy parecido al rango de 2 puntos, pero en este caso cuando se utilizan los 3 puntos no se cuenta el ultimo valor, por lo que tenemos de 1 hasta 1 que daría 1 solo elemento en el rango de 1...2.

 

Rangos por tipos

 

En Ruby tenemos un abanico de posibilidades para trabajar con rangos, por ejemplo con simbolos:

 

irb(main):011:0> :mama...:meme

=> :mama...:meme

irb(main):012:0> (:mama...:meme).class

=> Range

irb(main):013:0> (:mama...:meme).member? :mame

=> true

 

Explicando un poco, hemos creado un rango desde :mama hasta antes de :meme (no se cuenta :meme porque estamos usando los 3 puntos ( ... ) ), las propiedades de un rango son parecidos a los de un arreglo, tambien podemos usar el método " to_a " para convertirlo a arreglo

 

irb(main):042:0> (:mama...:meme).to_a.count

=> 2708

 

Aquí lo que se ha hecho es convertir el rango a un arreglo y contar con "count" con cuantas palabras cuenta ese rango y son 2708, que muy facilmente lo tenemos gracias a un rango de 1 sola línea de código.

 

Otro ejemplo con letras

 

irb(main):043:0> ('a'..'d').to_a

=> ["a", "b", "c", "d"]

 

Con números

 

irb(main):085:0> (1...4).to_a

=> [1, 2, 3]

 

Pero hay que tener cuidado con los decimales, no pueden ser convertibles a un arreglo (lamentablemente en nuestro sistema de numeración existe el infinito e imposibilita obtener datos finitos), si intentamos convertir un rango decimal a un arreglo nos va a devolver un error, por suerte si se pueden utilizar otros métodos determinísticos como include? o member?

 

irb(main):088:0> (1.1..1.4).member? 1.3

=> true

irb(main):089:0> (1.1..1.4).first

=> 1.1

irb(main):091:0> (1.1..1.4).max

=> 1.4

irb(main):092:0> (1.1..1.4).min

=> 1.1

 

Hay que notar que si el primer valor del rango es un entero y el segundo es un decimal, todo el rango se convierte en entero, por ejemplo:

 

irb(main):082:0> (1..4.4).to_a

=> [1, 2, 3, 4]

irb(main):097:0> (1..4.6).to_a

=> [1, 2, 3, 4]

 

El valor decimal del ultimo dato del rango no es redondeado sino que es truncado (osea no se toma en cuenta el valor decimal, por lo que 4.4 y 4.6 quedan finalmente como un simple 4)

 

Otro detalle a considerar es que los valores de los rangos tienen que ser del mismo tipo, si pongo un numero y una letra, el rango no se crea, otra forma de crear el rango es:

 

irb(main):099:0> Range.new 2,7

=> 2..7

irb(main):100:0> rango = (-1..3)

=> -1..3

irb(main):102:0> rango = -1..3

=> -1..3

irb(main):103:0> rango=-1..3

=> -1..3

 

Por suerte en esta asignacion no es trivial y podemos prescindir de los paréntesis.

 

Los rangos tambien pueden elaborarse de otros tipos de objetos pero estos tienen que ser compatibles (por ejemplo aquellos que deriven de la clase Time), en sí un rango nos abrevia mucho contar con valores sin tener que declararlos todos.

 

Y bien, hemos avanzado con este sencillo capitulo 14 y continuaremos con el capitulo 15, por favor dudas y comentarios pueden hacerlo si ningún tipo de restriccion, si desean agradecer también comenten.

Compartir este post

Repost 0
Published by Daniel A. Nuñez C. - en Tutorial Ruby
Comenta este artículo

Comentarios

Presentación

  • : El blog de Daniel A. Nuñez C.
  • El blog de Daniel A. Nuñez C.
  • : Un blog sobre tecnologías y futuro, también sobre lenguaje de programación Ruby y más.
  • Contacto

Perfil

  • Daniel A. Nuñez C.
  • Ingeniero de Sistemas
  • Ingeniero de Sistemas

Donaciones/Donations

Por favor considera realizar una donación

Please make a donation

btn_donateCC_LG.png

Buscar Tema En Este Blog

Archivos