yunomuのブログ

趣味のこと

「20分ではじめるRuby」解説 3ページ目

前回: 「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クラスのオブジェクトが23で、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_higteeter.say_byeはそのままsay_hisay_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あたりのこと

 ここで急に「ファイルに書いてみましょう」と言われて驚いたかと思います。その前にひとつ。

IRBを抜けるには、“quit”や“exit”とタイプするか、コントロールキーを押しながらDキーを押します。

 ここで出てくる"quit"はIRBの特殊なコマンドですが、exitRubyの機能です。マニュアルで言うと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で止めます。止まりましたよね? 止まらなかったらごめん。どうしようもないわ。

おわり

 MegaGreeterについては次回でよろしく。

次: 「20分ではじめるRuby」解説 4ページ目 - yunomuのブログ