• Home
  • About
    • taichi photo

      taichi

      ars longa vita brevis.

    • Learn More
    • Twitter
    • LinkedIn
  • Posts
    • All Posts
    • All Tags
  • Projects

Ruby 基礎(3)

03 Oct 2018

Reading time ~2 minutes

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メソッドをて定義



Ruby Share Tweet +1