日別アーカイブ: 2021年11月4日

Rubyのまとめ6(プロテクテッドメソッド、モジュール、メソッドの公開範囲)

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.
↑が出力されたので呼び出すことができた

バリデーションなどで使うので覚えておこう!