Ruby基礎2
この章では前回の Ruby基礎1 に引き続きRubyの基礎文法を学んでいきます。
まだ、前回の勉強をしていない人は こちら から始めるようにしてください。
条件分岐(if文)
Rubyにはそのときの状況に応じて、実行するプログラムを変えることができる条件分岐といった機能があります。 条件分岐はif文
を使って定義することができ、記述した条件文が正しいか正しくないかで処理を分岐させることができます。
条件分岐の定義
基本的な条件分岐の定義の仕方は、以下の通りです。
if 条件式 then
# 条件式が真(true)のときに実行する処理
end
if
の後に条件式を書き、then
とend
の間にその条件式が真(true)のときに実行する処理を書きます。 (then は省略することができます。)
条件式が偽のときの処理も加える
条件分岐は、条件式が偽(false)であった場合の処理も記述することができます。
条件式が偽のときに処理を行うには以下のようにelse
を使います。
if 条件式 then
# 条件式が真(true)のときに実行する処理
else
# 条件式が偽(false)のときに実行する処理
end
また、条件式のパターンが2パターン以上ある場合は、elsif
を使うことでいくつもの条件分岐をつくることができます。
if 条件式1 then
# 条件式1が真(true)のときに実行する処理
elsif 条件式2 then
# 条件式1が偽(false)のとき、かつ
# 条件式2が真(true)のときに実行する処理
else
# 条件式1と条件式2がどちらとも偽(false)のときに実行する処理
end
それでは早速色々な条件分岐をつくってみましょう。
# numberが30より大きいときのみ実行される
if number > 30 then
puts "大吉"
end
# それ以外のときは”凶”と表示させる
if number > 30 then
puts "大吉"
else
puts "凶"
end
# パターンを増やす
if number > 30
puts "大吉"
elsif number > 20
puts "中吉"
elsif number > 10
puts "末吉"
else
puts "凶"
end
繰り返し処理
繰り返し処理を使用すると、決まった回数や条件を満たしている間同じ処理を自動で繰り返すプログラムを書くことができます。
繰り返し処理を行うための文法にはfor、each、whileなどいくつかありますが、ここでは代表的なfor文とwhile文について学びます。
for文
for文は指定したオブジェクトや範囲から順に値を取り出しながら、繰り返し処理を行うために使用します。
例えば、1から100までの数値を順に取り出して、それぞれの数値に対して同じ処理をしたい場合や、複数のオブジェクトが入っている配列(配列については後述)に対して、中に入っている1つ1つのオブジェクトに同じ処理をしたいときなどに活用します。
for文は以下のように定義します。 (doは省略可能)
for 変数 in範囲や配列 do
# それぞれの変数に対して加えたい処理
end
このように、for文はin
の後に扱いたい範囲や配列を指定し、その内の1つ1つのオブジェクトを同じ変数として定義します。 その後、do
とend
の間に処理の内容を書くことで繰り返し処理を実行します。
それでは、早速for文をつかってみましょう。 (「1..10」は範囲オブジェクトと呼ばれるもので、for文の中で指定されると最初の値から最後の値までを順に要素として取り出します。)
# 1から10まで順に表示
for num in 1..10
puts num
end
# 1から100までの内5で割り切れる数字のみ表示
for num in 1..100
if num % 5 == 0
puts num
end
end
while文
while文は条件式が真(true)のときにずっと同じ処理を繰り返し続けます。
ある条件を満たすまで同じ処理を繰り返したいときなどに活用します。
while文は以下のように定義します。 (doは省略可能)
while 条件式 do
# 処理を実行する
end
このように、while文はwhileの後に条件式を記述し、その条件式が真(true)である間、do
とend
の間にある処理を繰り返し行います。
それでは早速while文を使ってみましょう。 (「number += 1」は自己代入演算子といった書き方で、「number = number + 1」を省略した書き方です。)
# numberが10以下のとき、numberに1を足して表示
number = 1
while number <= 10
puts number
number += 1
end
# numberが10で割り切れるまで、numberに1を足して表示
number = 1
while number % 10 != 0
puts number
number += 1
end
ループ処理を書いていると条件によってはいつまでも処理が終わらないという無限ループに入ってしまいます。 そうしたときはターミナルで「control + c」を押してプログラムを強制終了させましょう。
配列オブジェクト
配列オブジェクトとは、1つの変数で複数のオブジェクトを持つことのできるオブジェクトの1つで、箱をイメージするとわかりやすいです。
この箱(配列)の中にはたくさんのオブジェクトを何個入れることができ、中身のオブジェクトは順番によって管理されます。
配列の中のデータは要素と呼ばれます。要素は順番を持っていて、配列に入れた順に1番目,2番目…と自動的に順番が割り振られます。
配列の定義
配列は以下のように定義できます。
#配列の定義
配列名 = [要素1,要素2,要素3]
#配列の内3番目を取りだす
配列名[2]
このように、[](大括弧)
で囲むことによって配列を定義することができ、その中に要素を順に足していくことで要素を追加できます。 また、配列の要素を取り出すときは、その配列のインデックス番号を指定することで取り出すことができます。 (インデックス番号は「0」から始めることに注意してください。つまり1番目の要素のインデックス番号は0となります。)
要素の追加
生成した配列オブジェクトに新しい要素を追加したいときは<<メソッド
を使います。
先ほど生成した配列に要素4を追加します。
配列名 << 要素4
それでは早速、配列を使ってみましょう。
#配列の定義
irb(main):001:0> fruits = ["りんご","オレンジ","みかん","いちご"]
=> ["りんご", "オレンジ", "みかん","いちご"]
#3番目の要素を取り出す
irb(main):002:0> puts fruits[2]
みかん
=> nil
#新しい要素を追加する
irb(main):003:0> fruits << "もも"
#sliceメソッドを使って2番目から5番目までの要素を取り出す
irb(main):004:0> fruits.slice(1,3)
=> ["オレンジ", "みかん","いちご", "もも"]
#lenghメソッドを使って要素の数を数える
irb(main):005:0> puts fruits.length
5
=> nil
クラスとインスタンス
ここまでRubyによる基本文法を学んできましたが、ここではよりRubyの仕組みを理解するためにクラスとインスタンスという概念を学びます。
クラスとインスタンスを初めて学ぶときはイメージがしづらく、誰もが難しく感じます。繰り返し学習しながら、少しずつ理解していきましょう。
ここまでのおさらい
前の章でも述べましたが、Rubyにおいて全てのデータは「オブジェクト」として扱われます。これまで学習してきたオブジェクトの種類としては文字列オブジェクト、数値オブジェクト、配列オブジェクトといったものがありました。
また、それらのオブジェクトはそれぞれメソッドを持っておりました。これまで学習してきたメソッドの種類としては、lenghメソッド、getsメソッド、to_sメソッドなどがありました。
このように、同じ種類のオブジェクト(例えば文字列オブジェクト)には同じような性質があったり、同じようなメソッドが使えるようになっています。 こうしたものを定義しているのがクラスであり、クラスに基いて生み出されたオブジェクトのことをインスタンスと呼びます。
クラス
クラスを定義することによってどのような良いことがあるのでしょうか?
例えば、以下のような車のオブジェクトを生成するとしましょう。
- タイヤ、ハンドル、エンジンという要素があり、○ボタンを押すと前に進み×ボタンを押すと止まるというメソッドがそれぞれある
これらの性質やメソッドを1度定義するだけなら簡単ですが、もし1万種類車種があったとしたらどうでしょうか?
- A車はタイヤ、ハンドル、エンジンという要素があり、○ボタンを押すと前に進み×ボタンを押すと止まるというメソッドがそれぞれある
- B車はタイヤ、ハンドル、エンジンという要素があり、○ボタンを押すと前に進み×ボタンを押すと止まるというメソッドがそれぞれある
- C車はタイヤ、ハンドル、エンジンという要素があり、○ボタンを押すと前に進み×ボタンを押すと止まるというメソッドがそれぞれある
と、毎回定義をしていたら大変です。
また、後になって「やっぱりCボタンを押したらバックする機能を追加しよう」と思った時はでどうでしょうか? もちろん1万個のプログラムを全部書き換えることになってしまいます。
そこで以下のような車というクラスをあらかじめ定義しておいて、それを使ったほうが非常に簡単で安全なのです。
車クラス
共通の性質 | 共通のメソッド |
---|---|
タイヤ | ○ボタンを押すと前に進む |
ハンドル | ×ボタンを押すと止まる |
エンジン | |
塗装色 |
- 「車」というクラスを先に作っておいて、共通の性質とメソッドを定義しておく
- A車は「車」をコピーして塗装色だけ赤にする
- B車は「車」をコピーしてだけ塗装色だけ青にする
- C車は「車」をコピーして△ボタンを押すとクラクションがなるメソッドを追加する
インスタンス
クラスに基いて生み出されたオブジェクトのことをインスタンスと呼びます。 例えば、先ほどの車の例でいうと、車クラスに基づいて生み出されたA車、B車、C車といったオブジェクトがインスタンスということになります。
言い換えると、クラスに定義したそれぞれの属性(タイヤ、塗装色など)に具体的な値が入った状態でインスタンスは生成されるということになります。
クラスとインスタンスの定義
クラスとインスタンスを定義してみましょう。
まずは以下のようにクラスを定義します。 (クラス名は半角英大文字から始めます。注意してください)
class クラス名
# ここに共通の性質やメソッドを定義していく
end
インスタンスは以下のようにnewメソッド
を使用して生成します。
# クラスの定義
class People
# ここに共通の性質やメソッドを定義していく
end
# インスタンスの生成
person = People.new
インスタンスごとに中身の値の変わるクラスの性質は インスタンス変数 と呼ばれ、次のように 変数の初めに@
をつけて宣言されます。
インスタンス変数は同じクラス内であればどこでも使用することができます。
class People
def set_name
@name = gets.chomp #インスタンス変数の生成
end
end
早速、実際にシンプルな人のクラスを定義して実行してみましょう。
# クラスの定義
class People
#共通のメソッドを定義
def set_profile
puts "名前を入力してください"
@name = gets.chomp
puts "性別を入力してください"
@sex = gets.chomp
puts "年齢を入力してください"
@age = gets.chomp
end
#共通のメソッドを定義
def show_profile
line = "---------------------------"
puts "名前 : #{@name}\n#{line}\n"
puts "性別 : #{@sex}\n#{line}\n"
puts "年齢 :\n#{@age}\n#{line}\n"
end
end
# インスタンスの生成
person = People.new
# インスタンスの持っているメソッドを実行
person.set_profile
person.show_profile
ここまででRubyの基礎文法の学習は終了になります。 これまで学んだことを使って是非練習問題を解いてみましょう。
練習問題
-
おみくじ関数の生成 - ユーザーにターミナル上で好きな数字を入力してもらいその値を13で割ったときのあまりを出す - 余りが12だったら「大吉」、10 ~ 11だったら「中吉」、6 ~ 9だったら「小吉」、3 ~ 5だったら「末吉」、それ以外だったら「凶」とします。
-
[132, 143, 44, 154, 246, 24624, 47, 86, 46]というある配列の要素をそれぞれ13で割った時のあまりを出力してください。 - for文を使うこと
-
「タイトル」、「作者」、「出版年」といったインスタンス変数を持つBookクラスをつくる - 本の情報を登録することができるwrite_infoメソッドを定義 - 登録した本の情報を表示することができるshow_infoメソッドをて定義