それではgreeterオブジェクトを作り、使ってみましょう。
一度greeter
オブジェクトを作ると、Patという名前をおぼえてくれます。
ふむ、名前を直接取得しようとするとどうなるでしょう?
おっと、これはできませんでした。
Objectの殻の中
インスタンス変数はオブジェクトの内側に隠されています。とはいえ完全に
見えないようになっているのではなく、オブジェクトをinspectすれば
いつでも見ることはできますし、他にもアクセスする手段はあるのですが、
Rubyはデータを隠しておく、適切なオブジェクト指向アプローチをとっています。
では、Greeterオブジェクトにはどんなメソッドがあるのでしょうか?
おー。メソッドがいっぱいありますね。
メソッドは2つしか定義していないのに。
ここでは何が起こっているのでしょうか?
そう、これはGreeterオブジェクトの すべての メソッドで、
親やその上の祖先のクラスで定義されたメソッドを含めた、
完全なリストになっているのです。
Greeterで定義されたメソッドだけを一覧したいのなら、引数false
を渡します。
これは祖先のクラスで定義されたメソッドが不要であることを意味します。
お、こちらの方がよさそうですね。では、greeterオブジェクトがどのメソッドに
反応するか見てみましょう。
このように、say_hi
とto_s
(何かを文字列に変換するもので、
すべてのオブジェクトに標準で定義されているメソッドです)
は知っていましたが、name
は知りませんでした。
クラスの変更 - まだ間に合います
しかし、名前を表示したり変えたりしたい場合はどうでしょう?
Rubyはオブジェクトの変数にアクセスできる簡単な方法を用意しています。
Rubyでは、定義されたクラスをさらに変更できます。
この変更は新たに作られたオブジェクトすべてはもちろん、すでにあるオブジェクトにも
反映されます。それでは、@name
属性のついた新しくオブジェクトを作って
試してみましょう。
attr_accessor
を使うと2つの新しいメソッドが定義されます。
name
は値を参照するメソッドで、name=
は値を設定するメソッドです。
何にでも挨拶してくれる、MegaGreeterは無視しない!
このgreeterはそれほど興味深いものではないですが、一度に扱えるのは
1人だけです。世界にも、1人の人にも、リストの全員にも挨拶してくれる
MegaGreeterのようなものがあればどうでしょう?
対話式RubyインタプリタのIRBで直接書くのではなく、ファイルに書いてみましょう。
IRBを抜けるには、“quit”や“exit”とタイプするか、コントロールキーを押しながらDキーを押します。
このファイルを“ri20min.rb”という名前で保存して、“ruby ri20min.rb”と
実行しましょう。結果は以下のようになるはずです。
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!
...
...
この最後の例では新しいことがたくさん詰め込まれています。
詳しく見てみましょう。