Let's write a function to compute factorials. The
mathematical definition of n factorial is:
n! = 1 (when n==0)
= n * (n-1)! (otherwise)
In ruby, this can be written as:
def fact(n)
if n == 0
1
else
n * fact(n-1)
end
end
You may notice the repeated occurrence of end. Ruby
has been called "Algol-like" because of this. (Actually, the
syntax of ruby more closely mimics that of a langage named
Eiffel.) You may also notice the lack of a return
statement. It is unneeded because a ruby function returns the
last thing that was evaluated in it. Use of a return
statement here is permissible but unnecessary.
Let's try out our factorial function. Adding one line of code
gives us a working program:
# 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
print fact(ARGV[0].to_i), "\n"
Here, ARGV is an array which contains the command line
arguments, and to_i converts a character string to an
integer.
% ruby fact.rb 1
1
% ruby fact.rb 5
120
Does it work with an argument of 40? It would make your calculator
overflow...
When you invoke ruby with no arguments, it reads commands from
standard input and executes them after the end of input:
% ruby
print "hello world\n"
print "good-bye world\n"
^D
hello world
good-bye world
Ruby also comes with a program called eval.rb that
allows you to enter ruby code from the keyboard in an interactive
loop, showing you the results as you go. It will be used
extensively through the rest of the tutorial.
If you have an ANSI-compliant terminal (this is almost certainly
true if you are running some flavor of UNIX; under DOS you need to
have installed ANSI.SYS or ANSI.COM), you
should use this enhanced eval.rb
that adds visual indenting assistance, warning reports, and color
highlighting. Otherwise, look in the sample
subdirectory of the ruby distribution for the non-ANSI version that
works on any terminal. Here is a short eval.rb
session:
hello world is produced by print. The next
line, in this case nil, reports on whatever was last
evaluated; ruby does not distinguish between statements and
expressions, so evaluating a piece of code basically means
the same thing as executing it. Here, nil indicates
that print does not return a meaningful value. Note
that we can leave this interpreter loop by saying exit,
although ^D still works too.
Throughout this guide, "ruby>" denotes the input prompt
for our useful little eval.rb program.