LoginSignup
0
0

More than 1 year has passed since last update.

3/25 Ruby入門remained クラスなどなど編

Posted at

個人的リマインド用

クラス

class User(大文字から始める)
    def initialize(name)
        @name(インスタンス変数) = name
    end
    
    def sayHi
        puts "hi #{@name}"
    end
end

tom = User.new("tom") ← インスタンス化
tom.sayHi

bob = User.new("bob")
bob.sayHi

インスタンス変数はインスタンス内ならどこでもアクセスできる

インスタンス変数へ外部からのアクセス attr_accessorとself

class User(大文字から始める)
    attr_accessor :name (外部からアクセスできるように)
        #setter: name=(value) → (外部から)tom.name("tom")
        #getter: name → (外部から)p tom.name
    getterだけ定義したい時はattr_reader :name

    def initialize(name)
        @name(インスタンス変数) = name
    end
    
    def sayHi
        #self(メソッド内で書ける、そのメソッドを受け取っているインスタンス自身を
         指す。今回はtomのこと(レシーバーという))
        puts "hi #{@name}"
        puts "hi #{self.name}で書き換え可能(selfも省略可)"
    end
end

tom = User.new("tom") ← インスタンス化
tom.sayHi

bob = User.new("bob")
bob.sayHi

クラスのメソッドをインスタンス化せじ直接呼び出す

class User
    @@count(クラス変数) = 0
    VERSION(クラス定数) = 1.1

    def initialize(name)
        @@count += 1
        @name = name
    end

    def self.info
        puts "#{VERSION}: User class. #{@@count} instances(インスタンスした数)"
    end

User.info
p User::VERSION(外からも呼べる)

クラスの継承

class AdminUser(子クラス, Sub Class) < User(親クラス, Super Class)
    継承したクラスのメソッドも使えるし、上書きもできる(オーバーライド)
end

メソッドのアクセス権 public, protected, private

newした時に呼ばれるinitializeメソッドと、クラスの外に書いたメソッドは自動的にprivateになる

class User
    //クラス内からならprivateも呼び出せる
    //レシーバーを指定できないからselfを書かないように

    private
        def sayPrivate
            puts "Hi"
        end
end

User.new.sayPrivate(できない)
Sub classでもprivateを使えたり、オーバーライドできるので注意

moduleで名前空間(名前が被らないように)

module Movie
    VERSION = 1.1
    
    def self.encode
        puts "encode"
    end

    def self.loading
        puts "loading"
    end
end

Movie.encode
Movie.loading
p Movie::VERSION

moduleのもう1つの役割であるミックスイン

継承関係のない別々のクラスに同じメソッドを持たせたい時、その機能を持ったmoduleをつくる

module Debug
    def info(selfをつけずに単にインスタンスメソッドにしてあげると、
        それを他のクラスのインスタンスメソッドとしてはめ込むことができる)
        puts "#{self.class} debug"
    end
end

class Player
    include Debug
end

class Monster
    include Debug
end

Player.new.info → "Player debug"

例外処理

x = gets.to_i

begin
    p 100 / x
Rescue => ex(例外が格納)
    p ex.message(エラーのメッセージを表示)
    p ex.class(エラーのクラスを表示)
    puts "stop!"(自分でメッセージを表示)
ensure(エラーが起こっても続ける時)
    puts "__END__"
end

※自分で例外処理を作る場合
class MyError < StandardError(rubyの標準クラスを継承) end
begin
    if x == 3
        raise MyError
    end
    p 100 /x
rescue MyError
    puts "Error 3!"
rescue => ex(例外が格納)
    p ex.message(エラーのメッセージを表示)
    p ex.class(エラーのクラスを表示)
    puts "stop!"(自分でメッセージを表示)
ensure(エラーが起こっても続ける時)
    puts "__END__"
end
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