アラサーからのエンジニア転身blog

プログラミングの勉強や転職に関して記事にしていきます。

ruby基礎⑤メゾットのアクセス権、モジュール、ミックスイン、例外

ドットインストールのrubyの基礎が完了しました!!

また特定の障害を持った人が相談できる相談掲示板を作成中ですが、
bootstrapによるレイアウトを組みました。



無料でbootstrapのレイアウトを組めるツールがありました。めちゃ使えます!
HTMLも生成できて、貼り付けるだけです。
https://www.layoutit.com/




#-----------------------------------------------------------------
#  メゾットのアクセス権
# public
# protected :クラス内、同一パッケージ、サブクラス(子クラス)からアクセス可
# private :レシーバをしていできないメゾットになる
# initializeメゾットとクラスの外に書いたメゾットは自動的にprivateになる

class User

  def sayHi
    puts "hi!"
    sayPrivate #クラスの中であればプライベートメゾットを呼び出せる
    # self.sayPrivate #selfはインスタンスなので使用できない。
  end

  private

  def sayPrivate
    puts "private"
  end

end

# User.new.sayPrivate #レシーバを指定できないメゾットなので、こればできない
 User.new.sayHi
 =>
 hi!
 private

class AdminUser < User

  def sayHello
    puts "Hello!"
    sayPrivate
  end

end

AdminUser.new.sayHello #privateメゾットも継承されている
=>
Hello!
private

#AdminUserクラスでsayPrivateのオーバーライドも可能

#-----------------------------------------------------------------
#モジュールに関して
#クラスのようにメゾットや定数をまとめらる
#インスタンスを生成したり、継承ができない

#名前空間に関して 下記のようなメゾットを作ると、他のメゾット名と衝突する可能性がある
# そんな時にモジュールを作る
def movie_encode
end
def movie_export
end

module Movie #大文字で始まる

  VERSION = 1.1

  def self.encode
    puts "encoding..."
  end

  def self.export
    puts "exporting..."
  end

end

Movie.encode
Movie.export
p Movie::VERSION
=>
encoding...
exporting...
1.1

#関連する定数やメゾットをグループ化する時に使用できる。

#-----------------------------------------------------------------
#ミックスイン(モジュール)
#以下の二つのクラスは継承関係はなく、どちらのクラスにもデバックに関するメゾットを追加したい場合

module Debug
  def info
    puts "#{self.class}debug info......"
  end
end

class Player
  include Debug #これでDebug moduleのinfoを使用できるようになった。(ミックスイン)
end

class Monster
  include Debug
end

Player.new.info
Monster.new.info
=>
Playerdebug info......
Monsterdebug info......

#-----------------------------------------------------------------
#例外

x = gets.to_i
p 100 / x

0を入力するとエラーになる
下記のようにして0を入力すると

x = gets.to_i

begin
  p 100 / x
rescue => ex
  p ex.message
  p ex.class
  puts "stopped!"
ensure
  puts "-- END --"
end

入力値0
=>
"divided by 0"
ZeroDivisionError
stopped!
-- END --

#rubyの持つ例外クラスも使用できる
class MyError < StandardError;
end

x = gets.to_i

begin
  if x == 3
    raise MyError
  end
  p 100 / x
rescue MyError
  puts "not 3!"
rescue => ex
  p ex.message
  p ex.class
  puts "stopped!"
ensure
  puts "-- END --"
end

入力値 3
=>
3
not 3!
-- END --