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.
↑が出力されたので呼び出すことができた
バリデーションなどで使うので覚えておこう!
