Books / Ruby for Beginners / Chapter 6

Strings, Data Types and Objects in Ruby

Let’s look at the program from previous chapter. Can we do better?

puts "Your age?"
age = gets
puts "Your age is"
puts age

We can replace line 3 and 4 with a single line. For example:

puts "Your age?"
age = gets
puts "Your age is" + age

Result:

Your age?
30
Your age is30

Something is missing, isn’t it? That’s right, the space is missing between words “is” and “30”. As you can see from example above, we can join two strings. From a purely math point of view adding up two strings is nonsense, but strings do concatenate (join) in computer memory. Run the following code in REPL or as a program:

"My name is " + "Roman" + " and my age is " + "30"

Result:

My name is Roman and my age is 30

Now try to add these two numbers, both represented as a string, try to guess what would be the answer?

"100" + "500"

Spoiler: answer is “100500”. In other words, if number is represented as a string (comes in quotes), Ruby will treat this number as a string. But if we just type 100 + 500 (without quotes), produced result will be 600.

It turns out that you can also multiply string by a number:

"10" * 5
 => "1010101010"

Result is "10" repeated 5 times. If we leave space after 10, result will be represented in a more illustrative way:

"10 " * 5
 => "10 10 10 10 10 "

As it was mentioned before, "10 " is just a string, and we can use any string we want:

"I'm cool! " * 10
 => "I'm cool! I'm cool! I'm cool! I'm cool! I'm cool! I'm cool! I'm cool! I'm cool! I'm cool! I'm cool! "

But in practice, developers often multiply a single character by 80 (legacy text screen width). We can multiply strings like "*", "=", or "-" by 80 to logically separate results from input. For example:

puts "Your age?"
age = gets
puts "=" * 80
puts "Your age is " + age

Result:

Your age?
30
========================================================================
Your age is 30

Data Types

We have figured out how to join two strings with +. Also, we know that we can multiply string by a number. While experimenting we found that there are at least two types of data: strings and numbers (integers). And the number itself, but in quotes, is a string. Let’s see at how Ruby understands what is a number and what is a string:

$ irb
> "blabla".class
 => String
> "123".class
 => String
> 123.class
 => Integer

Documentation says that everything is an object in Ruby. So the result of any operation is object. Every object “implements method” called class. Expression “implements method” means that some programmer, developer of Ruby language, made a tiny sub-program (or sub-routine) that we can run if we know its name. To call this small program of any object we should type dot and the name of this program.

In our case above the name of this sub-program (or “method”, “function”) is class. By the way, don’t get confused. There are two things: 1) method class we call above by specifying dot at the beginning 2) class keyword, used to define a class of objects – we’ll cover it later in this book. If real-life objects could have methods, we would see something like this:

Apple.slice
Apple.amount_of_seeds
Apple.amount_of_worms
River.water_temperature
River.amount_of_fish

And so on. So that’s how every object in Ruby has method class:

Object.class

In our experiment at the beginning of this chapter, 123 (without quotes) and "blabla" are objects. Type of 123 is Integer. And type of "blabla" is String. Type of any object can be obtained by calling .class

Of course, every object has documentation with the list of supported methods. We encourage you to lookup documentation every time you have questions, and every time you work with this or another type. Documentation examples for different object types:

Documentation is quite easy to find if you search for “ruby object docs” or “ruby string docs”. Documentation covers everything we can do with an object, and it’s a “gold mine” of information, you shouldn’t ignore it, it should be your best friend. Programmer who doesn’t like or lazy about looking up documentation will hardly ever succeed.

Useful links:

There are also many other types of objects in Ruby, most important of them will be covered in the next chapters.

Exercise Open up your REPL and find out the data type for "". What’s the data type for 0 (zero)? What’s the data type for -1? What is the data type for approximate Pi-number: 3.14?

Exercise We know that .class method returns some sort of result for any object. REPL reads, evaluates and prints this result. But if everything is an object, it means that result is an object too. But does this object has a type? It should. What type of result method .class will return? Try to find this out by putting .class right after 123.class this way: 123.class.class. First part of this expression will return result. And the second part will return type of this result.

Everything Is An Object

We know that 123.class returns Integer, and "blabla".class returns String. But any object also has is_a? method, which returns true or false, depending on parameter you’re passing to this method:

$ irb
> 123.is_a?(Integer)
 => true

In example above we’re calling is_a? method for 123 object and passing parameter Integer. Method returns true. In other words, 123 is a type of Integer. The similar way we can test if 123 is String:

$ irb
> 123.is_a?(String)
 => false

Answer is false, 123 is not String, but "123" (in quotes) is String:

$ irb
> "123".is_a?(String)
 => true
> "blabla".is_a?(String)
 => true

By calling is_a? we’re kinda asking question in plain English “Is this a… ?”, “Is this object a string?”

We’ve confirmed that 123 is Integer, and "blabla" is String. Now let’s make sure integers and strings are objects:

$ irb
> 123.is_a?(Object)
 => true
> "blabla".is_a?(Object)
 => true

Great, numbers and strings are objects in Ruby! In other words, 123 is Integer and Object at the same time. And "blabla" is String and Object at the same time. In other words, there can be multiple objects, and objects can implement multiple types.

We’ll discuss later in this book what object really is. We don’t need to remember is_a? method at the moment, how to call this method, and what it returns (in computer literature it is called “method signature”, sometimes API - Application Program Interface). But it’s worth remembering .class, so you can any time check the type of any object (or the type of result of some operation).


Licenses and Attributions


Speak Your Mind

-->