SuzuBlog

webのお勉強はじめたばかりの初心者。備忘録

Ruby基礎④

アクセス権

共通

#アクセス権
# -public =>デフォルト、どこからでも呼び出し可
# -protected
# -private: レシーバーを指定できない

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

class User
    
    def sayHi
        puts "hi!"
        sayPrivate
        # self.sayPrivate
    end

    private 
    def sayPrivate
        puts "private"
    end

end

継承されたクラス内メソッドでの呼び出しも可能

class AdminUser < User

    def sayHello
        puts "hello!"
        sayPrivate
    end
end

# User.new.sayPrivate #NG(クラスの外からの呼び出し)

User.new.sayHi
AdminUser.new.sayHello

出力結果

hi!
private
hello!
private

同じ名称でオーバーライドした場合

class AdminUser < User

    def sayPrivate
        puts "private from Admin"
    end

end

User.new.sayHi
AdminUser.new.sayPrivate

出力結果

hi!
private
private from Admin

モジュール

名前空間
#モジュール(module) => クラスのようにメソッドや定数をまとめることができる
#インスタンスを作ったり継承したりはできない
#モジュール名の先頭は大文字であること
# - 名前空間を作ることで、名称の衝突を防ぐ
module Movie

    VEWSION = 1.1

    def self.encode
        puts "encoding..."
    end

    def self.export
        puts "exporting..."
    end

end

Movie.encode
Movie.export
p Movie::VEWSION

出力結果

encoding...
exporting...
1.1
ミックスイン
# module
# - ミックスイン
# selfをつけずに単にインスタンスメソッドにしてあげると、
# 他のクラスのインスタンスメソッドとしてはめ込むことができる
# 継承関係にない複数のクラスに共通の機能を提供する場合に便利
module Debug

    def info
        puts "#{self.class} debug info ..."
    end

end

class Player
    include Debug
end

class Monster
    include Debug
end

Player.new.info
Monster.new.info

出力結果

Player debug info ...
Monster debug info ...

例外

# x = gets.to_i
# p 100 / x

#上記だと0が渡された際に0除算となりエラーになってしまう
class MyError < StandardError; end #Rubyの標準的な例外クラスを継承

x = gets.to_i

begin
    if x == 3
        #3が入力されたときは任意のエラーを出す
        raise MyError
    end
p 100 / x
rescue MyError
    puts "not 3!"
rescue => ex # => ex のように描くと例外を入れてくれる
    p ex.message
    p ex.class
    puts "stopped!"
ensure
    puts "-- END --"
end