#クラス
プログラミングでつくりたい「もの」を生成するには、まずその「設計図」を用意する必要があります。
設計図のことをクラス、「もの」のことをインスタンスと呼びます。
##インスタンスを生成するステップ
① クラスを用意する
② クラスからインスタンスを生成する
③ インスタンスに情報を追加する
###① クラスを用意する
まずはクラス(設計図)を用意します。
クラスは「class クラス名」とすることで定義できます。
クラス名は必ず大文字で始めることと、「end」を書く必要があります。
例)
class Menu #クラス名は大文字で始める
end
###② クラスからインスタンスを生成する
クラス(設計図)を元に、新しくインスタンスを生成するには、「クラス名.new」とします。
また、「変数名 = クラス名.new」とすることで、生成したインスタンスを変数に代入することができます。
例)
class Menu
end
menu1 = Menu.new #Menuクラスからインスタンスを作成し、変数 menu1に代入
####インスタンス変数
インスタンス変数とは、インスタンスごとに独立して持つ変数である。
インスタンス変数のスコープはクラス内のメソッドであればどのメソッドでも生成した値と変わらず呼び出すことが可能です。
####attr_accessor
attr_accessorとはインスタンス変数にアクセスするために元からRubyに用意された機能のひとつです。
「attr_accessor :インスタンス変数」と入力します。
「attr_accessor :インスタンス変数」と書かないと、インスタンス変数にアクセスできないのでインスタンス変数を呼び出すことができません。
###③ インスタンスに情報を追加しよう
インスタンスに情報をもたせるには、インスタンス変数に値を代入する必要があります。
具体的には「インスタンス.変数名 = 値」とすることで、そのインスタンス変数に値を代入することができます。
また、「インスタンス.変数名」とすることで、そのインスタンス変数の値を用いることができます。
例)
class Menu
attr_accessor :name
attr_accessor :price
end
menu1 = Menu.new
menu1.name = "すし" #インスタンス(menu1)のインスタンス変数(name)に文字列("すし")を代入している
puts menu1.name
コンソール
すし
##システムをつくる
###クラスに処理を追加する
クラスの中ではメソッドを定義することができます。
クラスの中で定義し、インスタンスに対して呼び出すメソッドのことをインスタンスメソッドと呼びます。
インスタンスメソッドは、「インスタンス.メソッド名」のようにすることで、そのメソッドを呼び出すことができます。
例)
class Menu
attr_accessor :name
attr_accessor :price
def show #showメソッドを定義
puts "私はメニューです"
end
end
menu1 = Menu.new
menu1.show #クラスの中で定義したメソッドを呼び出す
コンソール
私はメニューです
インスタンスメソッドも、メソッドと同様に引数を受け取ったり戻り値を返すことができます。
例)
class Menu
def show(data)
return "私は#{data}です"
end
end
menu1 = Menu.new
puts menu1.show("メニュー")
コンソール
私はメニューです
###インスタンスメソッドの中でインスタンス変数を扱う
インスタンスメソッドの中では、特殊な変数「self」を用いて「self.変数名」とすることで、インスタンス変数を扱うことができるようになります。
例)
class Menu
def show_name
puts "私は#{self.name}です"
end
end
menu1 = Menu.new
menu1.name = "ピザ"
menu1.show_name #インスタンスメソッドの呼び出し
コンソール
私はピザです
インスタンスメソッドでは、変数「self」に、呼び出したインスタンス自身が代入されています。
##initializeメソッド
initializeメソッドとはインスタンスを生成した直後に処理を実行することができるメソッドである。
initializeメソッドは、「クラス名.new」でインスタンスを生成した直後に自動で呼び出されます。
例)
class Menu
...
def initialize
puts "メニューが生成されました"
end
...
end
menu1 = Menu.new
コンソール
メニューが生成されました
###initializeメソッドでインスタンス変数を扱う
例)
class Menu
...
def initialize
self.name = "ピザ" #インスタンス生成時に、"ピザ"をインスタンス変数nameに代入
end
...
end
menu1 = Menu.new
puts menu1.name
コンソール
ピザ
###initializeメソッドの引数
initializeメソッドは通常のインスタンスメソッドと同じように、引数を渡すこともできます。
その際、「クラス.new」に対して引数を渡すことで、initializeメソッドにその値を渡すことができます
例)
class Menu
...
def initialize(message)
puts message
end
...
end
menu1 = Menu.new("こんにちは")
コンソール
こんにちは
###initializeメソッドでインスタンス変数に値を代入する
initializeメソッドでインスタンス変数に引数の値を代入することで、インスタンス毎にインスタンス変数の値を変えることができます。
また、キーワード引数を使うことで見やすく書くことができます。
例)
class Menu
...
def initialize(name:,price:)
self.name = name
self.name = price
end
...
end
menu1 = Menu.new(name:"ピザ",price:800)
##インスタンスの配列
Menuクラスから生成したインスタンスも、配列の要素にすることが可能です。
例)
*
class Menu
attr_accessor :name
attr_accessor :price
def initialize(name:, price:)
self.name = name
self.price = price
end
def info
return "#{self.name} #{self.price}円"
end
def get_total_price(count)
total_price = self.price * count
if count >= 3
total_price -= 100
end
return total_price
end
end *
menu1 = Menu.new(name:"ピザ",price: 800)
menu2 = Menu.new(name:"すし",price: 1000)
...
menus = [menu1,menu2, ...]
menus.each do |menu|
puts menu.info
end
# この例から、*~*の部分は「*省略」とします。
コンソール
ピザ 800円
すし 1000円
...
###繰り返し処理で番号をつける
番号をつけるには、番号を保存するための変数をeach文の外で用意して、each文の処理の中で値を1だけ増やして更新するようにします。
例)
# *省略
menu1 = Menu.new(name:"ピザ",price: 800)
menu2 = Menu.new(name:"すし",price: 1000)
...
menus = [menu1,menu2, ...]
index = 0
menus.each do |menu|
puts "#{index}. #{menu.info}"
index += 1
end
コンソール
0. ピザ 800円
1. すし 1000円
...
##gets.chomp
入力を受け付けるには「gets.chomp」を使います。このコードが実行されると、コンソールが入力待機状態になります。
「変数 = gets.chomp」とすることで、エンターキーを押されるまでに入力された値を変数に代入することができます。
例)
puts "名前を入力してください"
name = gets.chomp # 入力した内容を変数に代入
puts "#{name}さん、いらっしゃいませ"
コンソール
名前を入力してください
Yukihiroと入力すると...
Yukihiroさんいらっしゃいませ
数値の場合は、「gets.chomp.to_i」とすることで、入力された内容を数値に変換し、計算などにも使えるようになります。
例)
puts "1つ100円のお菓子があります"
puts "いくつ買いますか?"
count = gets.chomp.to_i # 入力した内容を数値に変換
total_price = 100 * count
puts "お会計は#{total_price}円です"
コンソール
1つ100円のお菓子があります
いくつ買いますか?
3と入力すると...
お会計は300円です
###require
別のファイルに入っているコードを一番上の行で、「require "./〇〇"」とすることで、別のファイルのコードを読み込めるようになります。
例)
〇〇.rb
class 〇〇
...
...
end
△△.rb
require "./〇〇" # 〇〇.rbの読み込み
...
...