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

