Escribamos una función para calcular factoriales. La definición matemática para el factorial de n es:
n! = 1 si n == 0 = n * (n-1)! si n /= 0
En Ruby, esto se puede escribir como:
def fact(n) if n == 0 1 else n * fact(n-1) end end
Puedes haberte fijado en la aparición de “end” varias veces. Ruby es denominado “Algol-like” por esto. (Realmente, la sintáxis de Ruby imita más a un lenguaje llamado Eiffel.) También puedes haberte percatado de la falta de sentencias “return”. No son cesarias porque una función de Ruby devuelve la última cosa que ha evaluado. El uso de una sentencia “return” en este código está permitida pero es innecesaria.
Probemos nuestra función factorial. Añadiendo una una línea más de código tendremos un programa ejecutable:
# Program to find the factorial of a number # Save this as fact.rb def fact(n) if n == 0 1 else n * fact(n-1) end end puts fact(ARGV[0].to_i)
Aquí, ARGV es un vector que contiene los argumentos de la línea de comandos, y “to_i” convierte una cadena de caracteres es un entero.
$ ruby fact.rb 1 1 $ ruby fact.rb 5 120
¿Funcionará con el número 40? Quizás provoque un desbordamiento en cálculo…
$ ruby fact.rb 40 815915283247897734345611269596115894272000000000
Funciona. De hecho, Ruby puede manejar cualquier número entero que permita la máquina de tu memoria. Por tanto 400! puede ser calculado:
$ ruby fact.rb 400 64034522846623895262347970319503005850702583026002959458684 44594280239716918683143627847864746326467629435057503585681 08482981628835174352289619886468029979373416541508381624264 61942352307046244325015114448670890662773914918117331955996 44070954967134529047702032243491121079759328079510154537266 72516278778900093497637657103263503315339653498683868313393 52024373788157786791506311858702618270169819740062983025308 59129834616227230455833952075961150530223608681043329725519 48526744322324386699484224042325998055516106359423769613992 31917134063858996537970147827206606320217379472010321356624 61380907794230459736069956759583609615871512991382228657857 95493616176544804532220078258184008484364155912294542753848 03558374518022675900061399560145595206127211192918105032491 00800000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000
No podemos comprobar de un vistazo que esté correcto, pero debe de estar bien.
El bucle de lectura/evaluación
Cuando invocas a Ruby sin argumentos, lee comandos de la entrada estándar y los ejecuta después del fin de la entrada:
$ ruby puts "hello world" puts "good-bye world" ^D hello world good-bye world
El ^D de arriba significa Ctrl+D, una manera convencional para señalar el fin de una entrada en Unix. En DOS/Windows, prueba en su lugar a presionar F6 o ^Z.
Ruby también viene con un program llamado eval.rb que te permite introducir un código Ruby del teclado en un bucle interactivo, mostrándote los resultados según escribes. Será extensamente usado a lo largo de esta guía.
Si tienes una terminal compatible-ANSI (esto es casi seguro si estás bajo alguna versión de UNIX; bajo versiones de DOS necesitas tener instalado ANSI.SYS o ANSI.COM; Windows XP, por desgracia, ha hecho ahora esto casi imposible), deberías usar este eval.rb mejorado que añade asistencia visual a la indentación, informes de advertencia, y resaltado con colores. De otro modo, busca en el directorio de ejemplos de tu distribución de Ruby para la versión no ANSI que funciona en cualquier terminal. Aquí una breve sesión de eval.rb:
$ ruby eval.rb ruby> puts "Hello, world." Hello, world. nil ruby> exit
“Hello, world.” es producido por puts. La siguiente línea, en este caso nil, informa sobre lo último evaluado; Ruby no distingue entre expresiones y sentencias, así que evaluar un fragmento de código básicamente significa lo mismo que ejecutarlo. Aquí, nil indica que puts no devuleve nada con un valor significativo. Nótese que podemos abandonar el intérprete diciendo exit, aunque ^D tamibén sigue funcionando.
A lo largo de esta guía, “ruby>” denota el símbolo de entrada de nuestro pequeño y útil programa eval.rb.








