前回: 「20分ではじめるRuby」解説 2ページ目 - yunomuのブログ
オブジェクトを作る
それではgreeterオブジェクトを作り、使ってみましょう。
から始まります。最初から飛ばしていますね。
2ページ目の最後にclass Greeter
を書きましたね。これがクラスだという話でした。クラスとは何か。クラスとは、「整数」とか「文字列」のような、値の形のようなものです。「型」と言う時もあります。
1ページ目の時に「整数(Integer)」のマニュアルを見ましたが、そのIntegerもクラスです。マニュアルのBuiltin librariesのページで「クラス」の節の中からIntegerを探したのを覚えているでしょうか。Integerはクラスなので、マニュアルのクラスの節に書かれています。逆に、クラスの節に書かれているものは全てクラスなので、ここからの説明はおおむねあてはまります。そしてクラスはここに並んでいる以外にも自分で作ることもできます。つまりその作ったものがGreeter
です。
Greeter.new
のところから見てみましょう。
irb(main):035:0> greeter = Greeter.new("Pat")
このnew
というのは、クラスを元にオブジェクトを作るというメソッドです。オブジェクトというのは、クラス(型)に対する値のことで、つまりInteger
クラスのオブジェクトが2
や3
で、String
クラスのオブジェクトが"あいなちゃん"
とか"anchan"
とかになるイメージです。わかりますか。
IntegerやStringはリテラル(前回出てきた)でオブジェクトを作れますが、それ以外のほとんどのクラスではnew
メソッドを使ってオブジェクトを作ります。
new
メソッドのマニュアルはどこにあるかというと、おおむねほとんどのクラスにそれぞれあります。Stringにもあります。適当なクラスのマニュアルを探して見てみましょう。「特異メソッド」の項目にあるはずです。ただし、Integerにはnew
はありません。例外的にそういうクラスもあります。例外というのはどこにでもあります。そういうものだと思っておきましょう。
その上でGreeter.new("Pat")
が何をしているか。new
は実は2ページ目で書いたinitialize
を呼び出しています。ここの部分↓
irb(main):025:1> def initialize(name = "World") irb(main):026:2> @name = name irb(main):027:2> end
その後に出てくるgreeter.say_hi
やgteeter.say_bye
はそのままsay_hi
やsay_bye
を呼び出していますが、new
だけはinitialize
を呼び出します。これはnew
が特別だからで、その件についてはObject
クラスのマニュアルの中に書かれています。ややこしいですが、オブジェクトという用語とは別にObjectという名前のクラスが存在します。Builtin librariesのページのクラスの節からObject
のマニュアルを見てみましょう。
「privateメソッド」と書かれている節にinitialize
があると思います。ここに、要するにここで説明したようなことが書いてあります。new
を実行するとinitialize
が実行されます。何故そんなことになっているのか気になる場合は聞いてくれれば記事が増えます。
SyntaxError
irb(main):038:0> greeter.@name SyntaxError: (irb):38: syntax error, unexpected tIVAR, expecting '('
これはsyntax、つまり文法のエラーです。Rubyとしての書き方がなにか間違えている時に出るエラーです。エラーメッセージでは「'('がくるはずだったのになにかおかしい」というようなことが書かれていますが、そもそもRubyの規則に則っていないのでSyntaxErrorの場合のメッセージはあまり当てにならないことが多いです。'('や')'の書き忘れというパターンが多い気がします。がんばって探しましょう。
Objectの殻の中
ここではGreeter.instance_methods
を使って呼び出すことができるメソッドの一覧を出しています。この後、Greeter.instance_methods(false)
とfalse
を渡して見やすくしていますが、その前の大量に出てきた出力は何か。それこそが、マニュアルのクラスObject
のページで書かれていたメソッドたちです。
引数falseを渡します。 これは祖先のクラスで定義されたメソッドが不要であることを意味します。
と説明にあります。この「先祖のクラスで定義されたメソッド」という言葉の中の「先祖のクラス」というのがつまりObjectクラスです。Objectクラスは自分で定義したものも含めて全てのクラスの先祖になります。自動的になります。Rubyではそういうルールになっています。そのことは、Objectクラスのマニュアルの「要約」の節に書かれています。これはそういう意味です。
クラスの変更 - まだ間に合います
ここではattr_accessor
が出てきます。このマニュアルはBuiltin librariesのクラス節のClassのページにあります。クラスそのものもオブジェクトで、言わばClassクラスのオブジェクトなのです。これが重要になるのは何か既存のものの動きを書き換えたいとかそういうマニアックな欲求がある時なので、そういうのも後でいいでしょう。Rubyはなんでもアリなところがあるのでこういう機能はちょいちょい出てきます。
MegaGreeterあたりのこと
ここで急に「ファイルに書いてみましょう」と言われて驚いたかと思います。その前にひとつ。
ここで出てくる"quit"はIRBの特殊なコマンドですが、exit
はRubyの機能です。マニュアルで言うとBuiltin librariesのモジュールKernelにあります。前回(2ページ目)の記事で解説したKernelモジュールです。ここにexit
も「Rubyプログラムの実行を終了します。」と書いてあります。
それともうひとつ、「コントロールキーを押しながらDキーを押します。」について。これは専門用語で、Ctrl-D
とかC-D
とか^D
とも書きます。「ここでデータは終わりですよ」という意味です。IRB以外のコマンドでも使えることがあるのでたまに思い出すといいかもしれません。
これとは別に「コントロールキーを押しながらCキーを押す」というのもあります。Ctrl-C
とかC-C
とか^C
とも書きます。これは制御不能になった時に押します。具体的には無限ループになってしまった時などです。
以下のコードをIRBで実行してみましょう。
irb(main):011:1* while true irb(main):012:1* puts "ainachan" irb(main):013:0> end
これが"ainachan"連呼野郎です。止まりません。制御不能です。なのでC-C
で止めます。止まりましたよね? 止まらなかったらごめん。どうしようもないわ。