はじめに
rubyのclassについてまとめてみた
JavaScriptと似てる。
clsss
@ nameはインスタンス変数
アクセサーの設定なしだとインスタンス変数は内部でしか参照できない
class Menu
#initializeメソットで引数を受け取る
def initialize(name, price)
@name = name # 属性(メンバ変数)
@price = price # 属性(メンバ変数)
end
# インスタンスメソットを作成
def cal_tax
p @price * 1.08
end
def cal_sum(item1, item2)
p item1 + item2
end
# アクセサーを記述(外部から参照したい場合)
attr_accessor :name, :price
end
インスタンス化
# インスタンス生成時にインスタンス変数を設定
menu1 = Menu.new('高級寿司', 1800)
classの継承
class Menu ...
# 新しいクラス > 親クラスで継承できる
# 親クラスのインスタンス変数とメソットを継承できる
class Food > Menu
#新たなインスタンス変数を追加
attr_accessor :calorie
#新たなメソットを追加
def calorie_info
return "#{self.name}は#{self.calorie}kcalです"
end
end
オーバーライド
子クラスのメソットを親クラスのメソットと同じにして上書きする
superで親クラスの同名のメソッドを呼び出す
親クラスのメソッド内の重複
class Food < Menu
attraccessor :calorie
def initialize(name:, price:, calorie:)
# 親クラスの同名のメソッドを呼び出す
super(name: name, price: price)
self.calorie = calorie
end
end
外部から参照したい場合はアクセサーを使う
キーワード引数も使える
クラスメソッドを追加する
class Menu
#アクセサーを記述
attr_accessor :name
attr_accessor :price
# initializeメソットで引数を受け取る
# selfはthisみたいなもの
def initialize(name:, price:,)
self.name = name
self.price = price
end
## クラスメソッドを追加
# def クラス名.メソッド名 もしくは def self.メソッド名
def Menu.class_name?
# 処理
end
end
# インスタンス生成時にインスタンス変数を設定
menu1 = Menu.new(name: "ピザ", price: 800)
# インスタンスの変数を参照する
puts menu1.name
# クラス名を呼び出す
# クラスメソッドはクラスの中でも呼び出せる
puts Menu.class_name?
# インスタンスに対して呼び出すメソット → インスタンスメソット
# クラスに対して呼び出すメソッド → クラスメソッド
JavaScriptと比較
// JavaScript
class Person = {
constructor(name, age) {
this.name = name;
this.age = age;
}
hello() {
console.log(`私は${this.name} ${this.age}です`)
}
}
# Ruby
class Person
def initialize(name, age)
@name = name
@age = age
end
def hello
p "私は#{@name} #{@age}です"
end
end
すごく似てる。
JSの場合class外部からデフォルトでプロパティを参照できる
Rubyは外部からインスタンス変数を参照したい場合、アクセサーが必要
終わりに
始めてプログラム言語を学んだ時と比べて格段に理解しやすい。
基礎を固めるのは大事だとよく言われているので、Rubyは書籍を使って詳しく学んでいきたい。