クラスとは
オブジェクトを作る方法(newメソッド)
● オブジェクト作成
クラス.new #=>そのクラスのオブジェクト
● クラスの定義(class)
class クラス名
end
● クラスのオブジェクトを作る
クラス.new #=>そのクラスのオブジェクト
オブジェクトが呼び出せるメソッドを作る
● クラスでのメソッド定義
class クラス名
def メソッド名
end
end
● クラスに定義したメソッドを呼び出す
class Drink
def name
"カフェラテ"
end
end
drink = Drink.new ————#①Drinkクラスのオブジェクトを作って変数drinkへ代入
puts drink.name ————#②Drinkクラスのオブジェクトのnameメソッドを呼び出す
↪️カフェラテ
● クラスに引数を受け取るメソッドを定義する
class Drink
def order(name) ————#引数として受け取ったオブジェクトを変数nameへ代入
puts "#{name}をください"
end
end
drink = Drink.new ————#Drinkクラスのオブジェクトを作って変数drinkへ代入
drink.order("カフェラテ") ————#orderメソッドを呼び出して引数で”カフェラテ”を渡す
↪️カフェラテ
● クラスの中で同じクラスのメソッドを呼び出す
class Drink
def name
"モカ" + topping ————#①同じクラスのtoppingメソッドを呼び出し
end
def topping
"エスプレッソショット"
end
end
drink = Drink.new ————#②
puts drink.name ————#③
↪️モカエスプレッソショット
オブジェクトにデータを持たせる
● インスタンス変数
class Drink
def order(item)
puts "#{item}をください"
@name = item ————#インスタンス変数@nameに注文した商品itemを代入
end
def reorder
puts "#{@name}をもう一杯ください" —#orderメソッドで変数@nameに代入した商品を使う
end
end
drink = Drink.new ——————#①
drink.order("カフェラテ") ————#②
drink.reorder ———————#④
↪️カフェラテをください
カフェラテをもう一杯ください
● インスタンス変数を取得するメソッドを作る
class Drink
def order(item)
puts "#{item}をください"
@name = item
end
def name ————#①nameメソッドを定義
@name ————#②戻り値として@nameに代入されているオブジェクトを返す
end
end
drink = Drink.new
drink.order("カフェラテ")
puts drink.name ————#③drink.nameの戻り値を画面に表示しする
↪️カフェラテをください
カフェラテ
● インスタンス変数へ代入するメソッドを作る
class Drink
def name=(text) ————#①name=メソッドを定義した
@name = text ———#③引数で渡された”カフェオレ”をインスタンス変数@nameへ代入
end
def name
@name
end
end
drink = Drink.new
drink.name="カフェオレ” ———#②name=メソッドを呼び出し、引数として”カフェオレ”を渡す
puts drink.name
↪️カフェオレ
● instance_variablesメソッド
class Drink
def name=(text)
@name = text
end
def name
@name
end
end
drink = Drink.new
drink.name=("カフェラテ")
puts drink.name
p drink.instance_variables ————#インスタンス変数の変数名一覧を取得するメソッド
↪️カフェラテ
[:@name]
● selfを使ってレシーバーを調べる
class Drink
def name=(text)
p self ——————#②
@name = text
end
def name
@name
end
end
drink = Drink.new
drink.name=("カフェラテ")
puts drink.name
p drink ————#①
↪️#<Drink:0x00007fc9f90d8980> ————①で表示したdrinkオブジェクト
カフェラテ
#<Drink:0x00007fc9f90d8980 @name="カフェラテ"> ————②でselfで取得してレシーバ
# :に続く文字列はそのオブジェクトの認識番号で、これが同じであれば同じオブジェクトです
オブジェクトが作られる時に処理を行う
● initializeメソッド
class Drink
def initialize ——————#①initializeメソッドを定義
puts "新しいオブジェクト!"
end
end
Drink.new ——#②newメソッド呼ばれるとオブジェクトが作られますが、その際にinitializeメソッド
↪️新しいオブジェクト! -------#が自動で呼ばれる。
● インスタンス変数の初期値設定する
class Drink
def initialize
@name = “カフェラテ” ——#①インスタンス変数@nameに”カフェラテ”が代入されます
end
def name
@name
end
end
drink = Drink.new ——#②Drink.newしてオブジェクトが作られる時にinitializeメソッドが呼ばれる
puts drink.name
↪️カフェラテ
● initializeメソッドへ引数を渡す
class Drink
def initialize(name) ———-#①initializeメソッドに引数を受け取るに定義しています
@name = name ———#②引数で受け取ったオブジェクトを@nameへ代入します
end
def name
@name
end
end
drink = Drink.new("モカ") ———#③newメソッドを呼び出し”モカ”を渡しています
puts drink.name ————#④@nameの変数の中身を表示すると”モカ”
↪️モカ
クラスを使ってメソッドを呼び出す
● クラスメソッドを定義する
def self.メソッド名
end
class Cafe
def self.welcom ——————#①クラスメソッドを定義する時はメソッド名の前にself.をつける
"いらっしゃいませ!"
end
end
puts Cafe.welcom ———#②Class.welcomeのように、クラス名につづいて.メソッド名で呼び出すことができます。
↪️いらっしゃいませ!
● 同じクラスのメソッドを呼び出す
class Cafe
def self.welcome
"いらっしゃいませ!"
end
def self.welcome_again
welcome + "いつもありがとうございます!" ————#クラスメソッドwelcomeを呼び出し
end
end
puts Cafe.welcome_again
↪️いつもありがとうございます!
継承を使ってクラスを分ける
● 継承を使ってクラスを分ける
class クラス名 < スーパークラス名
end
class Item
def name
@name
end
def name=(text)
@name = text
end
end
class Drink < Item ———#①
def size
@size
end
def size=(text)
@size = text
end
end
item = Item.new
item.name = "マフィン"
drink = Drink.new
drink.name = "カフェオレ" ——————#②
drink.size = "tall"
puts "#{drink.name} #{drink.size}サイズ"
↪️カフェオレ tallサイズ
①class Drink < Item でクラスを定義すると、Itemクラスを継承したDrinkクラスを作ることができる。このDrinkクラスはItemクラスの全てのメソッドを受け継具ことができる。つまりここでは、Itemクラスとnameメソッドとname=メソッドをDrinkクラスでも使うことができる。
②でDrinkクラスのオブジェクトへ呼び出しているname=メソッドは、親にあたるItemクラスのname=メソッドを使っている。
● 親メソッドのメソッドを呼び出す -super
class Item
def name
@name
end
def name=(text)
@name = text
end
def full_name ———#④superで呼び出される
@name
end
end
class Drink < Item
def size
@size
end
def size=(text)
@size = text
end
def full_name ———#②full_nameを定義
super ————#③親クラスの同名メソッドだ呼び出される
end
end
item = Item.new
item.name = "マフィン"
drink = Drink.new
drink.name = "カフェオレ"
drink.size = "tall"
puts drink.full_name ———#①呼び出し
↪️カフェオレ
メソッドの呼び出しを制限する
● クラスのメソッド定義の中だけで呼び出せるメソッドを作る
class Cafe
def staff
makanai —————#①
end
private ————#③以降で定義するメソッドをprivateなメソッドにする
def makanai
"店員用スペシャルメニュー"
end
end
cafe = Cafe.new
puts cafe.staff
puts cafe.makanai ————#②
↪️店員用スペシャルメニュー
Traceback (most recent call last):
one.rb:13:in `<main>': private method `makanai' called for #<Cafe:0x00007f89db87c7d0> (NoMethodError)
● privateとpublic
class Foo
def a ————#public
end
def b ————#public
end
private
def c ————#private
end
public
def d ————#public
end
end
# Privateをメソッド定義するdefの前に書くことで、そのメソッドだけをprivateなメソッドにできる
class Foo
private def a ————#private
end
def b —————#public
end
end
● privateなクラスメソッドを定義する
class Foo
private_class_method def self.a ——#メソッド定義のdefの前にprivate_class_methodと書く
"method a"
end
end
p Foo.a
↪️Traceback (most recent call last):
one.rb:7:in `<main>': private method `a' called for Foo:Class (NoMethodError)