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