Ruby でのプログラミングは、オブジェクトたちが飛び回り、踊り歌う世界の台本を書く作業と言えるかもしれません。
新しいクラスを作ることは、キャラクターの新しい種族を作れるようになることに相当します。
新しいクラスを作ることで、新しい特徴を持ったキャラクター(プログラミングの世界ではオブジェクト)を作ることができます。
- オブジェクトは、自分が所属するクラスが持つメソッドを使うことができる
- OK :
1.even? - NG :
"1".even?
- OK :
newメソッド → そのクラスのオブジェクト(インスタンス)を作るHoge.new→Hogeクラスのインスタンスを作る
クラスに新しくメソッドを定義することは、ゲームキャラクターが新しい呪文を覚えることに相当します。
キャラクターが呪文を覚えるとできることが増えるように、オブジェクトもメソッドを呼び出せるようになると、できることが増えていきます。
クラスとは
- 各種オブジェクトはそれぞれのクラスに属している
p "a".class # String
p 1.class # Integer
p 1.1.class # Float
p true.class # TrueClass
p [1, 2, 3].class # Array
p ({x: 1, y: 2}).class # Hash
p :z.class # Symbol- クラスとは「オブジェクトの種族を表すもの」
- すべてのオブジェクトは、いずれかのクラスに属している
インスタンス
- 「クラスに属するオブジェクト」→「そのクラスのインスタンス」であるとも表現できる
- インスタンスはオブジェクトとほぼ同じ意味で使うが
- 「クラスから作ったオブジェクトである」「そのクラスに属する」ことを強調したい時に使う
各クラスに用意されたメソッド
- 各種オブジェクトは、それぞれが所属するクラスが用意するメソッドを利用できる
p 1.even?
# false
p 2.even?
# true
p [2].even?
# undefined method `even?' for [2]:Array (NoMethodError)リファレンスマニュアルの使い方
- リファレンスマニュアルは、クラスごとにメソッド一覧が書かれている
- 以下の方法で目的にリーチすると良い
classメソッドで所属するクラスを特定- リファレンスで当該のクラスの中からメソッドを探す
オブジェクトを作る 2 つの方法
- 基本的な方法
a = 1 # Integer オブジェクト
b = "hoge" # String オブジェクトnew メソッドを使ったオブジェクト作成
クラス名.new(そのクラスのオブジェクトを作る)- クラスから作られたオブジェクト → インスタンス
- クラスを
newメソッドで呼び出すことで、そのクラスのオブジェクト(インスタンス)が作られる- メソッド引数なしの場合、それぞれの空のオブジェクトが生成される
- メソッドに引数を渡すと、それぞれのオブジェクトが生成される
Integerクラスにはnewメソッドは無い
p String.new # ""
p String.new("hoge") # "hoge"
p Array.new # []
p Array.new(2, "fuga") # ["fuga", "fuga"]クラスは自作できる
- 「こんな機能を持ったオブジェクトがあったら便利だな」といった場面でクラスを自作する
- そのクラスのオブジェクトを作り、使うことでプログラムを整理して各ことができる
- クラスはその種類のオブジェクトを作ることができる工場のようなもの
- そのクラス自身が仕事をすることもあれば、そのクラスから作ったオブジェクトが仕事をすることもある
クラスの定義
class クラス名
end- 簡単に定義できるが、これだけで
newやclassといったメソッドを使うことができる
class Drink
end
drink = Drink.new # 1.
p drink.class # 2.newメソッドでDrinkクラスのオブジェクトを作り、変数drinkに代入drinkをclassメソッドを使ってクラス名を確認
クラス名の規則 キャメルケース
- クラス名の先頭は大文字、2 文字目以降は小文字にする
DrinkItem
- 2 語以上の単語になる場合は、キャメルケースを使う
CaffeeLatteListGenerate
余談:クラス名は定数
- 定数は大文字から書き出す
- 定数は変数と違い、(基本的に)上書き変更不可
- クラスを定義すると、クラス名の定数が作られる
余談:クラスもオブジェクト
- クラスもオブジェクトなので
classメソッドを呼び出すと、どのクラスに属しているかが分かる
class Drink
end
p Drink.class
# Classクラスにメソッドを定義する
- クラスは定義しただけでは、
newやclassといった最低限の機能しかない - クラスにメソッドを追加していくことで、欲しい機能を持ったクラスを育てていける
- クラスに新たなメソッドを追加定義していくことは、ゲームに例えると新しい魔法が増えていく感覚に似ている
class クラス名
def メソッド名
end
endクラスに定義したメソッドの呼び出し
オブジェクト.メソッド
class Drink
def name
"coffee"
end
end
drink = Drink.new # 1.
p drink.name # 2.
# "coffee"Drinkクラスのオブジェクトを作ってdrinkに代入
(クラス名.new→ そのクラスのオブジェクトを作る)Drinkクラスのオブジェクトnameメソッドを呼び出し
- クラスに定義したメソッドは、そのクラスに属するすべてのオブジェクトで呼び出すことができる
- クラスにメソッドを定義しておけば
- そのクラスからオブジェクトを作る
- そのオブジェクトたち全員がメソッドを呼び出せる
レシーバ
- レシーバ(受け取る人)
- 「メソッドを呼び出されるオブジェクト」のこと
- 以下の例の場合、「(変数
drinkに代入された)Drinkクラスのオブジェクト」がレシーバになる
class Drink
def name
"coffee"
end
end
drink = Drink.new2.even?even?メソッドのレシーバは、2(整数オブジェクト)
["a", "b", "c"].sizesizeメソッドのレシーバは、["a", "b", "c"](配列オブジェクト)
methods メソッドを使って利用可能なメソッドを確認できる
- レシーバであるオブジェクトで呼び出せるメソッドを一覧表示できる
p drink.methodsクラスに引数を受け取るメソッドを定義
class Calc
def plus(x, y)
x + y
end
def minus(x, y)
x - y
end
end
calc = Calc.new
p calc.plus(2, 7) # 9
p calc.minus(7, 24) # -17クラスの中で同じクラスのメソッドを呼び出す
- クラスに定義されたメソッドの中で、同じクラス内のほかのメソッドを呼ぶ際は、メソッド名をそのまま書くことで呼び出せる
class Calc
def plus(x, y)
x + y + num_100 # 2.
end
def minus(x, y)
x - y
end
def num_100
100
end
end
calc = Calc.new # 3.
p calc.plus(5, 2) # 1.
# 107calc.plus→ レシーバ (calc) を指定したメソッドの呼び出しnum_100→ レシーバを省略した書き方- 省略すると、実行中の
plusメソッドのレシーバである 1. のcalcがレシーバとなる
- 省略すると、実行中の
- つまり、2. の
num_100のレシーバは、3. で作られたCalcクラスのオブジェクトとなる
self を使ってレシーバを調べる
- レシーバが何かが分からないときは
selfを使って調べることができるselfは、その場所でメソッドを呼び出したときのレシーバを返す
class Calc
def plus(x, y)
p self # 2.
x + y + add_100
end
def minus(x, y)
x - y
end
def add_100
100
end
end
calc = Calc.new
p calc # 1.
p calc.plus(5, 2)
# #<Calc:0x000000010ed749c0>
# #<Calc:0x000000010ed749c0>
# 107- クラス
Calcから生成されたオブジェクト selfで取得したレシーバ
ともに #<Calc:0x000000010ed749c0> となり、同じオブジェクトを指している
オブジェクトの識別番号
:に続く文字列 → オブジェクトの識別番号0xは共通- 識別番号が同じ → オブジェクトが同じ
レシーバを省略しない書き方
selfでレシーバを取得できることを利用して、レシーバを省略せずに記述すると下記になるx + y + self.add_100