Delimitadores de sentencias
Algunos lenguajes requieren algún tipo de puntuación, a menudo el punto y coma (;), para finalizar toda sentencia de un programa. Por el contrario, Ruby recurre al convenio seguido por shells como sh y csh. Varias sentencias en una línea se han de separar con puntos y comas sin que se necesite al final de la línea; LF se trata como un punto y coma. Si una línea termina en \ (backslash) se ignora el LF que le sigue; lo que permite tener una única línea lógica que comprende varias líneas físicas.
Comentarios
¿Por qué escribir comentarios? Aunque el buen código tiende a ser auto-descriptivo, a menudo es útil realizar comentarios en el margen. Es un error creer que otras personas que examinen el código comprendan inmediatamente lo que se pretendía hacer. Aparte, y desde una perspectiva práctica, quién de nosotros no ha tenido que realizar una corrección o mejora en un programa después de un cierto periodo de tiempo y decir: he escrito esto, pero ¿qué demonios se supone que hace?
Algunos programadores experimentados señalarán, con bastante razón, que comentarios contradictorios o desactualizados pueden ser peor que ningún comentario en absoluto. Evidentemente, los comentarios no deben ser un sustituto de un código legible; si el código es poco claro, es probable que también sea erróneo. Es probable que se necesite comentar más cuando se está aprendiendo Ruby y menos cuando se llegue a expresar las ideas en código sencillo, elegante y legible.
Ruby sigue el convenio, común entre los lenguajes de guiones, de utilizar el símbolo de la almohadilla para indicar el comienzo de un comentario. El interprete ignora cualquier cosa que siga a una almohadilla, que no esté entre comillas, hasta el final de la línea en la que aparece
Para facilitar la escritura de grandes bloques de comentarios el interprete también ignora cualquier cosa comprendida entre una línea inicial con =begin y una final con =end.
|| #!/usr/bin/ruby
=begin
*
Este es un bloque de comentarios, algo que se escribe en beneficio de
los lectores (incluido uno mismo). El interprete lo ignora. No hay
necesidad de utilizar '#' al comienzo de cada línea
*
=end
||
Organización del código
El intérprete de Ruby procesa el código conforme lo lee. No existe nada semejante a una fase de compilación; si algo no se ha leído todavía, sencillamente está sin definir.
|| # Este código da lugar al error "undefined method":
print successor(3),"\n"
def successor(x)
x + 1
wend
||
Como cabría esperar a primera vista esto no fuerza a que se deba organizar el código de un modo estrictamente bottom-up. Cuando el intérprete encuentra la definición de un método puede incluir con seguridad referencias no definidas, siempre y cuando se asegure que se definirán antes de llamar realmente al método:
|| # Conversión de fahrenheit a celsius, dividida en dos pasos
def f_to_c(f)
scale (f - 32.0) # Referencia adelantada, pero es correcto
end
def scale(x)
x * 5.0 / 9.0
end
printf "%.1f es una temperatura agradable.\n",f_to_c( 72.3 )
||
Aunque pueda parecer un poco menos adecuado que lo que se suele usar en Perl o Java, es menos restrictivo que intentar escribir código C sin prototipos (lo que obliga a mantener siempre una ordenación parcial de quién referencia a quién). Poner el código de más alto nivel al final del fichero, funciona siempre. Y esto no es una gran molestia aunque a primera vista lo pudiese parecer. Una forma sensata e indolora de conseguir el comportamiento que se desea es definir una función main al principio del fichero y llamarla al final.
|| #!/usr/bin/ruby
def main
# Aquí el código de nivel superior
end
# ... Todo el código de apoyo aquí, organizado como se crea más adecuado ...
main # ... y se inicia la ejecución aquí.
||
También sirve de ayuda que Ruby proporcione herramientas para dividir programas complicados en bloques legibles, reutilizables, y relacionados lógicamente. Se ha visto la utilización de include para acceder a módulos. Pero también pueden ser útiles load y require. load funciona como si el fichero al que referencia fuese copiado y pegado (algo parecido a la directiva #include del preprocesador C). require es un poco más sofisticada, carga el código como mucho sólo una vez y cuando se necesite. Existen otras diferencias entre load y require; para más información se puede acudir el manual del lenguaje o a la FAQ.
Esto es todo
Este tutorial debería se suficiente para arrancar y escribir programas en Ruby. Si surgen más preguntas se puede bucear en el manual de referencia para aprender Ruby con más detalle. También son fuentes importantes de recursos la FAQ y la biblioteca de referencia
¡Suerte y felices codificaciones!