Not many people like to read heaps of boring syntax rules when they're
picking up a new language. So we're going to cheat. In this section
we'll hit some of the highlights, the stuff you'll just
have to
know if you're going to write Ruby programs. Later, in Chapter
18, which begins on page 199, we'll go into
all the gory details.
Let's start off with a simple Ruby program. We'll write a method that
returns a string, adding to that string a person's
name. We'll then invoke that method a couple of times.
def sayGoodnight(name)
result = "Goodnight, " + name
return result
end
# Time for bed...
puts sayGoodnight("John-Boy")
puts sayGoodnight("Mary-Ellen")
|
First, some general observations. Ruby syntax is clean. You don't
need semicolons at the ends of statements as long as you put each
statement on a separate line. Ruby comments start with a
#
character and run to the end of the line. Code layout is
pretty much up to you; indentation is not significant.
Methods are defined with the keyword
def
, followed by the method
name (in this case, ``
sayGoodnight
'') and the method's
parameters between parentheses. Ruby doesn't use braces to delimit
the bodies of compound statements and definitions. Instead, you simply
finish the body with the keyword
end
. Our method's body is
pretty simple. The first line concatenates the literal string
``Goodnight,
'' to the parameter
name
and assigns the result to
the local variable result. The next line returns that result to the
caller. Note that we didn't have to declare the variable
result
;
it sprang into existence when we assigned to it.
Having defined the method, we call it twice. In both cases we pass the
result to the method
puts
, which simply outputs its argument
followed by a newline.
Goodnight, John-Boy
Goodnight, Mary-Ellen
|
The line ``
puts sayGoodnight("John-Boy")
'' contains two method calls,
one to
sayGoodnight
and the other to
puts
. Why does one call
have its arguments in parentheses while the other doesn't? In this
case it's purely a matter of taste. The following lines are all
equivalent.
puts sayGoodnight "John-Boy"
puts sayGoodnight("John-Boy")
puts(sayGoodnight "John-Boy")
puts(sayGoodnight("John-Boy"))
|
However, life isn't always that simple, and precedence rules can make
it difficult to know which argument goes with which method invocation,
so we recommend using parentheses in all but the simplest cases.
This example also shows some Ruby string objects. There are many ways
to create a string object, but probably the most common is to use
string literals: sequences of characters between single or double
quotation marks. The difference between the two forms is the amount of
processing Ruby does on the string while constructing the literal. In
the single-quoted case, Ruby does very little. With a few exceptions,
what you type into the string literal becomes the string's value.
In the double-quoted case, Ruby does more work. First, it looks for
substitutions---sequences that start with a backslash character---and
replaces them with some binary value. The most common of these is
``
\n
'', which is replaced with a newline character.
When a
string containing a newline is output, the ``
\n
'' forces a
line break.
puts "And Goodnight,\nGrandma"
|
produces:
The second thing that Ruby does with double-quoted strings
is expression interpolation. Within the string, the sequence
#{
expression
}
is replaced by the value of
expression. We could use this to rewrite our previous method.
def sayGoodnight(name)
result = "Goodnight, #{name}"
return result
end
|
When Ruby constructs this string object, it looks at the current value
of
name
and substitutes it into the string. Arbitrarily complex
expressions are allowed in the
#{...}
construct. As a
shortcut, you don't need to supply the braces when the expression is
simply a global, instance, or class variable. For more
information on strings, as well as on the other Ruby standard types, see
Chapter 5, which begins on page 47.
Finally, we could simplify this method some more. The value returned
by a Ruby method is the value of the last expression evaluated, so we
can get rid of the
return
statement altogether.
def sayGoodnight(name)
"Goodnight, #{name}"
end
|
We promised that this section would be brief. We've got just one more
topic to cover: Ruby names. For brevity, we'll be using some terms
(such as class variable) that we aren't going to
define here. However, by talking about the rules now, you'll be ahead
of the game when we actually come to discuss instance variables and
the like later.
Ruby uses a convention to help it distinguish the usage of a name: the
first characters of a name indicate how the name is used.
Local variables, method parameters, and method names should all start
with a lowercase letter or with an underscore. Global variables are
prefixed with a dollar sign ($), while instance variables begin with
an ``at'' sign (@). Class variables start with two ``at'' signs (@@). Finally,
class names, module names, and constants should
start with an uppercase letter. Samples of different names are given
in Table 2.1 on page 10.
Following this initial character, a name can be any combination of
letters, digits, and underscores (with the proviso that the character
following an @ sign may not be a digit).
Example variable and class names
Variables
|
Constants and
|
Local
|
Global
|
Instance
|
Class
|
Class Names
|
name
|
$debug
|
@name
|
@@total
|
PI
|
fishAndChips
|
$CUSTOMER
|
@point_1
|
@@symtab
|
FeetPerMile
|
x_axis
|
$_
|
@X
|
@@N
|
String
|
thx1138
|
$plan9
|
@_
|
@@x_pos
|
MyClass
|
_26
|
$Global
|
@plan9
|
@@SINGLE
|
Jazz_Song
|
|
|