yunomuのブログ

趣味のこと

「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では、ハッシュマークで始まる行の内容は コメントになり、インタプリタからは無視されます。

'#'で始まる行は意味が無いので何を書いてもいいよという話です。マニュアルでは、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

 「式」の部分には、例にあるように、truefalseになる何らかの式が入ります。age >= 12ageが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つだけ書くことができます。elsifelseも省略しても構いません。

演算子

 ついでに、演算子式について。

 メソッドの中には演算子と呼ばれるものがあります。演算子メソッドは特別な書き方ができます。例えば、+はIntegerのメソッドですが、普通のメソッドのように1.+(2)と書くこともできますが、1 + 2と書くこともできます。これが実は特別な話だったのです。

 演算子といえば、一般的には+, -, *, /などがありますが、Rubyには他にも色々あります。

 そのあたりのマニュアルは、Ruby言語仕様の「演算子式」のページにあります。

@names.nil?

 say_hiのif文の式のところに書いてある@names.nil?とはなにか。@namesは一旦initializeの中で定義されている変数だと思ってください。その上で@names.nil?は、Builtin librariesのObjectクラスのページに説明があります。

nil? -> bool
レシーバが nil であれば真を返します。

 つまり、@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値を返す」ということです。つまり'?'がついたメソッドはtruefalseの値を返します。

 これは厳密にはルールではないのですが、お約束です。「'?'がついているメソッドではbool値を返すようにしよう」という暗黙の約束がRubyの世界にはあります。別に守る必要は無いのですが、守った方がみんなわかりやすくて便利だよねということです。Rubyに限らずプログラミング言語にはこういうお約束が時々あります。会社やチームによって決められることもあります。特に守る必要も無いのですが、一人の時は自分ルールを持っておくと後で助かることもあるかもしれません。チームにルールがある場合はそちらに従うと良いでしょう。そういうあいまいなことも時々あります。

おわり

 「20分ではじめるRuby」の4ページ目が、最初のsay_hiメソッドの途中で終わりました。次回はつづきで、4ページ目その2という感じで続けていきます。その3くらいまでいきそうな気がしますがよろしくお願いします。