「20分ではじめるRuby」解説 4ページ目
前回: 「20分ではじめるRuby」解説 3ページ目 - yunomuのブログ
最後です。
実行
まずは3ページ目に戻って、「ファイルに保存して実行」です。
このファイルを“ri20min.rb”という名前で保存して、“ruby ri20min.rb”と 実行しましょう。
メモ帳でもなんでもいいので、MegaGreeterの書いてあるソースコード部分を全部打ち込みます。別にコピペでもいいです。ただ、打ち込んでみて雰囲気を感じるのも最初は良いものです。ここで「メモ帳は使いにくにな」と思って壮大なテキストエディタ探しの旅に出るのも楽しいかもしれません。WindowsだとEmEditorとかTeraPadなどが有名ですが、そういうRubyに対応したエディタだとソースコードに自動的に色をつけてくれたりして、見やすくなることがあります。
書いたソースコードを保存します。保存場所は、コマンドラインでirb
などを実行しているディレクトリ(フォルダ)がいいでしょう。dir
コマンドなどを実行するとファイル一覧が表示されると思いますが、その一覧の中に"ri20min.rb"があればとりあえず成功です。実行しましょう。
C:¥Users¥yunomu> ruby ri20min.rb
こんな感じで。
例の通りに表示されていれば成功です。なんかエラーが出た場合は、中身を見てみましょう。FileNotFoundErrorならファイル名(ri20min.rb)を間違えているか、保存場所が違います。SyntaxErrorやNameErrorやNoMethodErrorの場合は、どこかに打ち間違いとかがあります。メッセージで出ている場所の近辺を探してみましょう。
コメント
'#'で始まる行は意味が無いので何を書いてもいいよという話です。マニュアルでは、Ruby言語仕様の「字句構造」のところにあります。内容は1行くらいしかありません。
次の一文、
このファイルの最初の行は 特別な行で、Unix系のOSではファイルをどう実行するかをシェルに知らせてくれます。
これは、先ほど書いたソースコード(ri20min.rb)の一行目のこれのことです。
#!/usr/bin/env ruby
これはUnix系のOSの時だけ関係ある話で、別に無くても構いませんし、Windowsとかだと無意味だったり書き方が違ったりします。まあ書かなくてもいいでしょう。
if, elsif, else, end
say_hi
の中でif
を使っていますね。if文です。これは条件分岐といって、「晴れていたら外に出かける。そうでなければ家でゲーム」みたいなやつです。条件分岐が出てくるとかなりプログラミングっぽさが出てきます。
マニュアルはRuby言語仕様の「制御構造」のページです。条件分岐の節の最初にifの項目があります。とりあえず例をirbかなにかで書いて実行してみるとよいでしょう。制御構造は慣れていても書き方をよく忘れるのでよくお世話になるページのひとつです。
今まではなんとなく流していましたが、「文法」と書いてあるブロックを見てみましょう。
if 式 [then] 式 ... [elsif 式 [then] 式 ... ] ... [else 式 ... ] end
これはif文の書き方を示しています。[
と]
で囲まれている部分は、あってもなくても良いという意味です。なのでthen
は書いても書かなくても良いということです。面倒なので書かなくてよいです。
say_hi
では一番複雑な、if, elsif, elseが全部登場するパターンで書かれています。つまり一番シンプルなのは以下のパターンです。式がtrueなら"hello"と出力し、falseなら何もしません。
if 式 puts "hello" end
「式」の部分には、例にあるように、true
かfalse
になる何らかの式が入ります。age >= 12
はage
が12以上ならtrueということです。true(真)
かfalse(偽)
になる値のことを真偽値(bool)と言います。
もちろん>=
にもマニュアルがあります。これはIntegerのメソッドなので、Builtin librariesのIntegerクラスのページにあります。
self >= other -> bool
比較演算子。数値として等しいまたは大きいか判定します。
これは、age >= 12
の例で説明すると、self
(age: Integerの数値)がother
(12: これもIntegerの数値)以上どうかを真偽値(bool)で表すという意味で、正しければtrue
という意味になります。要するに数学の"≧"です。
elsif
は、おそらく"else if"の略で、最初のifの条件で引っかからなかった場合にもう一度条件を書く場合に登場します。例えばこのように使います。
if age < 12 # ageが12より小さい時の処理 elsif age < 15 # ageが12より小さくなくて、15より小さい時 elsif age < 18 # ageが12より小さくなくて、15より小さくなくて、18より小さい時 else # それ以外 end
このように、elsif
はいくつでも書くことができます。else
はそれ以外の場合がある時に1つだけ書くことができます。elsif
もelse
も省略しても構いません。
演算子式
ついでに、演算子式について。
メソッドの中には演算子と呼ばれるものがあります。演算子メソッドは特別な書き方ができます。例えば、+
はIntegerのメソッドですが、普通のメソッドのように1.+(2)
と書くこともできますが、1 + 2
と書くこともできます。これが実は特別な話だったのです。
@names.nil?
say_hi
のif文の式のところに書いてある@names.nil?
とはなにか。@names
は一旦initialize
の中で定義されている変数だと思ってください。その上で@names.nil?
は、Builtin librariesのObjectクラスのページに説明があります。
つまり、@names == nil
と同じ意味です。ここでnil
というのは、無です。他の言語ではnullだったりします。つまり@names.nil?
は@names
が無(nil
)だった場合にtrue
になります。
さらにnil
とは何か。nil
はNilClassのオブジェクトです。Builtin librariesのページからNilClassのマニュアルを探して見てみましょう。メソッドのマニュアルを見てみると、おおむね虚無っぽい挙動をしていることがわかると思います。
nil
はどのような時に使うのか。それは、変数を作りたいけどまだ具体的な値を入れたくない時に使います。例えば以下のコードのように、tall
の値によって内容を変えたい時などです。
a = nil # 変数aを作りたいが中身がまだ決まっていない。 if tall > 150 a = "anchan" else a = "ainachan" end puts a
ただしこの場合は、if文が値を返すので以下のように書いた方が良いです。(if文のマニュアルを確認してください)
a = if tall > 150 "anchan" else "ainachan" end puts a
でも似たような場合でもa = nil
と書いてから何かやった方が便利な時もあるので、そういう時のためにnil
というものが存在します。プログラミングはひとつのことをやるためにいくつもの答えが存在します。その中から適切なものを選ぶために、良い例も良くない例も一応見ておきましょう。上の例でどちらがいいのかは、ちょっこれだけではなんとも言えないというのが正直なところです。
最後に'?'がついているメソッド
マニュアルをざっと見てまわった方はお気づきかもしれませんが、メソッドの中には'?'で終わるメソッドがあります。@names.nil?
もそうですし、例えばIntegerには結構たくさんあります。
Integerクラスのマニュアルを見てみましょう。インスタンスメソッドの項目にeven?
やodd?
があります。これは偶数か奇数かを判定するメソッドです。他にも、Numberから継承したメソッドの項目にはpositive?
やnegative?
なんかもあります。意味はマニュアルを見ればわかるでしょう。継承についてはまた別に説明します。
'?'がついているメソッドには共通の特徴があります。「bool値を返す」ということです。つまり'?'がついたメソッドはtrue
かfalse
の値を返します。
これは厳密にはルールではないのですが、お約束です。「'?'がついているメソッドではbool値を返すようにしよう」という暗黙の約束がRubyの世界にはあります。別に守る必要は無いのですが、守った方がみんなわかりやすくて便利だよねということです。Rubyに限らずプログラミング言語にはこういうお約束が時々あります。会社やチームによって決められることもあります。特に守る必要も無いのですが、一人の時は自分ルールを持っておくと後で助かることもあるかもしれません。チームにルールがある場合はそちらに従うと良いでしょう。そういうあいまいなことも時々あります。
おわり
「20分ではじめるRuby」の4ページ目が、最初のsay_hi
メソッドの途中で終わりました。次回はつづきで、4ページ目その2という感じで続けていきます。その3くらいまでいきそうな気がしますがよろしくお願いします。