5から続く
プロテクテッドメソッド
class User attr_reder :name def initialize(name, deposit) @name = name @deposit = deposit end def bigger_than?(person) person.deposit < @deposit end protected def deposit @deposit end end suzutuki = User.new('suzutuki', 50000) kunugi = User.new('kunugi', 30000) suzutuki.bigger_than?(kunugi) kunugi.bigger_than?(suzutuki) #.rbで出力すると true false #クラスの外では呼び出せないよ suzutuki.deposit NoMethodError:
モジュール
クラスのようにメソッドや定数をまとめられるが
インスタンスが作れない、継承ができない
関連するメソッドや定数などをまとめてグループ化したいだけの時に、
手軽に使える。
module モジュール名 #モジュールの定義 (メソッドや、定数など) end
module Driver def self.run puts 'Run' end def self.stop puts 'Stop' end end Driver.run Driver.stop #.rbで出力すると Run Stop # driver = Driver.new #インスタンス生成できない # module TaxiDriver < Driver #継承できない # end モジュールはインスタンス化できないのでself.でやる
module SampleNumber NUMBER = 300 def number NUMBER end end puts SampleNumber::NUMBER include SampleNumber puts number puts NUMBER #.rbで出力すると 300 300 300 inncludeすることで定数をどちらでも呼び出せるようになる
module SampleModule def sum(a,b) a + b end module_function :sum end puts SampleModule.sum(4, 7) ruby.module0.rbで出力 11
module SampleModule def sum(a,b) a + b end end class Port include SampleModule def call_sum(a, b) sum(a+ b) end end port = Port.new puts port.sum(4, 7) puts port.call_sum(8, 7) #.rbで出力すると 11 15 include "モジュール名" でモジュールに定義されたメソッドを呼び出せる
例外と例外処理
puts '数値を入力してください' i = gets.to_i begin #例外が起きうる処理 puts 10 / i puts "begin's end" rescue => ex #例外が発生した場合の処理 puts 'error!' puts ex.message puts ex.class ensure # 例外が発生しても、しなくても、最後に実行したい処理 puts '終わり' end #.rbで出力すると 数値を入力してください 0 error! divided by 0 ZeroDivisionError 終わり
puts “begin’s end”はエラー時は無視される
#実務ではよく使うので特に重要
例:2 [1] pry(main)> begin [1] pry(main)* val = 10/ 0 [1] pry(main)* puts val [1] pry(main)* rescue => e [1] pry(main)* p e.full_message [1] pry(main)* p e.message [1] pry(main)* p e.class [1] pry(main)* end 1: from (pry):2:in `__pry__'\n(pry) :2:in `/': \e[1mdivided by 0 (\e[4;1mZeroDivisionError\e[m\e[1m)\n\e[m""divided by 0" ZeroDivisionError => ZeroDivisionError
メソッドの公開範囲
・public
誰からも見える
・protected
あまりつかわれない
・private
自分からしかみえない
class User def initialize(name) @name = name end private def hello puts "Hello! I am #{@name}." end end suzutuki = User.new('suzutuki') suzutuki.hello #.rbで出力すると Traceback (most recent call last): access.rb:14:in `<main>': private method `hello' called for #<User:0x00000000010c4260 @name="suzutuki"> (NoMethodError) suzutuki:~/environment/ruby_projects $ ruby access.rb privateによってエラーが出る privateをコメントアウトなどすると問題ない Hello! I am suzutuki.
class User def initialize(name) @name = name end def say hello end private def hello puts "Hello! I am #{@name}." end end suzutuki = User.new('suzutuki') suzutuki.say def say hello endにより #.rbで出力すると Hello! I am suzutuki. ↑が出力されたので呼び出すことができた
バリデーションなどで使うので覚えておこう!