Ruby is a very powerful, fun, and expressive language – I thought instead of continuing my sometimes long winded Intro To XXX series this morning, I’d post a cheat sheet of sorts to get you started writing Ruby code quickly.
Numbers
Ruby has three built-in types to support numeric values: Fixnum
, Bignum
, and
Float
. The names are pretty indicative of what they’re used for, Fixnum for fixed length integers,
Bignum for infinite length integers, and Float for floating point numbers.
12345 # Fixnum (decimal) 0x45DF # Fixnum (hexadecimal) 04577 # Fixnum (octal) 0b11010010 # Fixnum (binary) 12345678901234567890 # Bignum
Fixnum stores values in a native machine word minus 1 bit. Values that can not be represented in this size are automatically converted to a Bignum instance.
Strings
Strings in Ruby may be either single or double quoted. Single quoted strings will not be evaluated in Ruby,
other than two special back-slash notation expressions: \
and '
. Double quoted
strings will be evaluated for expression subsitution, and will obey back-slash notation the way most C, C++, and
Java developers would expect.
puts 'This is my string.\n It does not look the way I think.\n' puts "This is my string.\nIt looks just fine to me!\n"
Yields the following output:
This is my string.\n It does not look the way I think.\n This is my string. It looks just fine to me!
Expressions substitution in double quoted strings allows you to insert arbitrary values inline, instead of using string formatting syntax:
myname = "Timothy Fanelli" myage = 25 intro1 = "Hello, my name is #{myname} and I am #{myage}." intro2 = "Hello, my name is " + myname + " and I am " + myage.to_s + "." intro3 = "Hello, my name is %s and I am %d." % [ myname, myage ]
intro1
, intro2
and intro3
are all identical strings.
The third string is a general case of using Ruby’s builtin sprintf
or format
function,
which look like this:
sprintf( formatstring, *args ) format( formatstring, *args )
Where you can pass any number of arguments in (they’ll be converted to an array called args), and
formatstring
can use the following conversion specifiers:
%b Binary integer %c Single character %d Decimal integer %e Decimal integer displayed in exponential form %f Floating point number %g Same as %e if exponent is less than -4, %f otherwise %o Octal integer %s String %u Unsigned decimal integer %x Hexadecimal integer
You can substitute %E, %G and %X for %e, %g and %x respectively if you prefer capital letters in your notation.
Regular Expressions
Ruby has powerful builtin regular expression support. A regular expresion is expressed either as a pattern between delimiting forward-slashes, a pattern between an arbitrary delimiter preceded by a %r, or can be declared explicitly as a Regexp class instance, like so:
/pattern/ /pattern/im # Regex with modifiers. %r!pattern! Regexp::new( "pattern", modifiers )
Any of these declarations can be treated as a Regexp instance. Calling Regexp::match( string ) will
return a Match object or nil
if the string does not match the pattern. Match objects can be indexed
into if you used match groups in your regular expression.
Where ! in this instance could be replaced by either a matching pair of parenthesis, square or angle brackets or simpy two of any character of your choosing.
The following regular expression modifiers are supported:
i Regexp::IGNORECASE Case insensitive x Regexp::EXTENDED Ignore whitespace and allow comments in regular expressions m Regexp::MULTILINE Treat new lines as regular characters instead of whitespace o Substitute only once
Methods
The general form for all Ruby method declarations is as follows:
def methodname ( parameterlist ) method body end
The parameter list can contain any number reference names, and can optionally have two special arguments
indicated by an asterisk and ampersand respectively: *var
and █
. Any excess
parameters passed into a method beyond those explicity declared in the method’s parameter list will be
converted to an array and passed in as var
(or whatever you chose to name it). █
will be a Proc
instance if a code block was specified, or nil otherwise.
Methods that support code blocks, such as List::sort, are called like so:
mylist = [ 'a', 'c', 'x', 'b' ] mylist.sort { |a,b| a <=> b }
Where the sort method takes no explicit arguments, and only a Proc instance. This mechanism allows you
to pass arbitrary code blocks into a method that can be executed repeatedly. This is comparable to C’s
function pointers or C#’s delegate type. The arguments a
and b
between the vertical
bars are the arguments to the Proc instance that will passed in when it is executed.
The return value of a method can be explicitly stated using a return
statement. If return
is omitted, then the method returns the value of the last expression evaluated.
Classes
You can define a class using the class
keyword, and there’s built in support for your
standard public, private and protected access control mechanisms:
class Fruit public def initialize( color ) setColor color end def getColor @color end protected def setColor( color ) @color = color end private def doSomething end end class Lemon < Fruit def initialize super 'yellow' end end mylemon = Lemon::new
In this case Lemon
extends Fruit
. Lemon::initialize
is public
by default because it’s not under any other access modifier. initialize
is a special method that gets
triggered when an object is instantiated using the built in new
. super
, when used in a method
calls the parent class method of the same name. If no arguments are specified to super
then the calling
method’s arguments are passed in the same order to the parent class’ method. Finally, the @
prefix
on a variable declares it as an instance variable of the class. An @@
prefix would declare it as a
class variable, which is comparable to static
variables in C++ objects and Java.
Modules
Modules are very similar to classes, except that they have no base class and can not be instantiated. Use the
module
keyword to declare a module, like so:
module Colors def convertToRGB( colorname ) ... end end
A class can include a module using a mechanism knowns as “Mix-ins”:
class Fruit include Colors initialize( color ) @color = convertToRGB( color ) end end
Including a module makes its methods and properties available to your class.
Conclusion
So that’s where I’ll leave off for now. This is still just the very basics, but it should be more than enough to get you on your way to becoming a Ruby developer!