0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby 入門 [クラス]

Posted at

クラスとは

オブジェクトを作る方法(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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?