Thursday, October 29, 2009

Section 14.1. Data Types










14.1. Data Types


Data types in Ruby aren't the data types that you're used to from the more traditional languages, such as C, COBOL, or Pascal. Because Ruby is purely object-oriented, you won't even find the primitive data types available in Java, for instance. In Ruby, you see, all data types are based upon classes.


This doesn't mean that there is no such thing as an integer or a string in Ruby; it means only that they are instances of the Integer and String classes. To some, this "everything is a class" approach might sound like overkill, but it also makes a lot of sense. Personally, I think it would be easier to code without having to change gears all the time. Just put my mind in OOP gear and go. This leaves the question, go where? I'm thinking of an island.



14.1.1. Numeric


"I am not a number, I'm a free man!" is the somewhat well-known quote from the British television series The Prisoner. I really don't see what Number Six was complaining aboutit could have been worse. He could, for example, have had a job that he hated in a nuclear power plant, like Number Five did. Number Six does, however, share something in common with Homerer, Number Five. You see, they were both integers.


Integer, with a capital I, is the base class from which all things integer are derived. Examples of classes derived from Integer are Bignum and Fixnum. Although each has its own characteristics, they both inherit from the Integer base class, whose properties and methods appear in Table 14-1.



Table 14-1. Integer Properties and Methods

Method

Class

Description

chr

Integer

Returns a string containing the character equivalent to the number value.

downto

Integer

Iterates a block of code.

integer?

Integer

Returns true.

next

Integer

Increments the value by 1.

size

Bignum

Returns the number of bytes used to store the value.

size

Fixnum

Returns the number of bytes used to store the value.

step

Integer

Increments the value to an ending value in increments of a set value.

succ

Integer

Increments the value by 1. Essentially, the same as the next method.

times

Integer

Executes a block of code a preset number of times.

to_f

Bignum

Converts the value to a float. When the value is too large to be contained in a float, infinity is returned.

to_f

Fixnum

Converts the value to a float.

to_i

Bignum

Returns a Bignum.

to_i

Fixnum

Returns a Bignum.

to_s

Bignum

Returns a String.

to_s

Fixnum

Returns a String.

upto

Integer

Executes a block of code, incrementing the value by 1 until the indicated value is reached.



However, with the exception of those poor souls trapped on the island, there is more to life than integers; there's floating point, called Float in Ruby. In case you've forgotten, floating-point numbers are those numbers with fractions, like when the statisticians say that the average American family has 2.6 children. The number 2.6 is a floating-point number and, depending on my mood, is either of my two half-brothers.


As with the Integer class, the Float class has a number of properties and methods, which are described in Table 14-2.


Table 14-2. Float Properties and Methods

Method

Description

ceil

Returns the closest integer, either equal to or greater than the float's value.

finite?

A Boolean indicating whether the value is a valid floating-point number.

floor

Returns the largest integer that is less than or equal to the value.

infinite?

Returns true or false, indicating whether the value is infinite.

nan?

Returns true or false, indicating whether the value is Not A Number.

round

Rounds the value to the nearest integer.

to_f

Returns a Float.

to_i

Converts the value to an integer.

to_s

Returns a String.






14.1.2. String


For people who program in more than one language, there is a major advantage to strings being instances of the String class. Think of it as one-stop shopping; if something needs to be done, there's a really good chance that there is a method to do it. In fact, there are so many that I recommend going to the Ruby home page (www.ruby-lang.org/en/) to see them all.




14.1.3. Boolean


In programming, there are always two possible answers to any question: true and false. Maybe that is why there are two classes, trueclass and Falseclass. Actually, with the dynamic nature of variables in Ruby, that is the truth. The trueclass represents a logically true value, and the Falseclass represents a logically false class.




14.1.4. Objects


Possibly because of the total lack of primitives, the built-in objects in Ruby are incredibly rich and varied. There are objects for hashing, objects for file access, and even an object for arrays. In many instances, if you can imagine it, an object probably already is available for what is necessary, as the following list of built-in classes shows:


Array                                      FalseClass

Bignum File::Stat

Binding File

Class Fixnum

Continuation Float

Dir Hash

Exception Integer
IO Regexp

MatchData String

Method Struct

Module Struct::Tms

NilClass ThreadGroup

Numeric Thread

Object Time

Proc TrueClass

Range


With all those built-in properties and methods, it might be a little while before it is necessary to write an object of our own, but it might be a good idea to give it a try. Let's say, for example, that we want to add a math class that would have two methods: add and subtract. Through diligent work and clean living, we would create the code shown in Listing 14-1.


Listing 14-1. myMath Class





class MyMath
def add(a, b)
puts a + b
end

def subtract(a, b)
puts a - b
end
end

m = MyMath.new
m.add(1, 1)
m.subtract(4,2)




That's all there is to creating and using a class in Ruby. Unfortunately, I was evil and skipped ahead a little by using variables and operators. Thinking about it, this is a little like a college class I had. After an unusually difficult test, the professor announced that no one got Question 10 correct, and perhaps the reason was that he had forgotten to teach that. Hmm ....













No comments: