Once the greeter object is created, it remembers that the name is Pat. Hmm,
what if we want to get at the name directly?
Nope, can’t do it.
Under the Object’s Skin
Instance variables are hidden away inside the object. They’re not
terribly hidden, you see them whenever you inspect the object, and there
are other ways of accessing them, but Ruby uses the good object-oriented
approach of keeping data sort-of hidden away.
So what methods do exist for Greeter objects?
Whoa. That’s a lot of methods. We only defined two methods. What’s going
on here? Well this is all of the methods for Greeter objects, a
complete list, including ones defined by ancestor classes. If we want to
just list methods defined for Greeter we can tell it to not include
ancestors by passing it the parameter false, meaning we don’t want
methods defined by ancestors.
Ah, that’s more like it. So let’s see which methods our greeter object
responds to:
So, it knows say_hi, and to_s (meaning convert something to a
string, a method that’s defined by default for every object), but it
doesn’t know name.
Altering Classes—It’s Never Too Late
But what if you want to be able to view or change the name? Ruby
provides an easy way of providing access to an object’s variables.
In Ruby, you can reopen a class and modify it. The changes will
be present in any new objects you create and even available in existing
objects of that class. So, let’s create a new object and play with its
@name property.
Using attr_accessor defined two new methods for us, name to get the
value, and name= to set it.
Greeting Anything and Everything, MegaGreeter Neglects None!
This greeter isn’t all that interesting though, it can only deal with
one person at a time. What if we had some kind of MegaGreeter that could
either greet the world, one person, or a whole list of people?
Let’s write this one in a file instead of directly in the interactive
Ruby interpreter IRB.
To quit IRB, type “quit”, “exit” or just hit Control-D.
Save this file as “ri20min.rb”, and run it as “ruby ri20min.rb”. The
output should be:
Hello World!
Goodbye World. Come back soon!
Hello Zeke!
Goodbye Zeke. Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Engelbert!
Goodbye Albert, Brenda, Charles, Dave, Engelbert. Come
back soon!
...
...