個人的リマインド用
クラス
class User(大文字から始める)
def initialize(name)
@name(インスタンス変数) = name
end
def sayHi
puts "hi #{@name}"
end
end
tom = User.new("tom") ← インスタンス化
tom.sayHi
bob = User.new("bob")
bob.sayHi
インスタンス変数はインスタンス内ならどこでもアクセスできる
インスタンス変数へ外部からのアクセス attr_accessorとself
class User(大文字から始める)
attr_accessor :name (外部からアクセスできるように)
#setter: name=(value) → (外部から)tom.name("tom")
#getter: name → (外部から)p tom.name
getterだけ定義したい時はattr_reader :name
def initialize(name)
@name(インスタンス変数) = name
end
def sayHi
#self(メソッド内で書ける、そのメソッドを受け取っているインスタンス自身を
指す。今回はtomのこと(レシーバーという))
puts "hi #{@name}"
puts "hi #{self.name}で書き換え可能(selfも省略可)"
end
end
tom = User.new("tom") ← インスタンス化
tom.sayHi
bob = User.new("bob")
bob.sayHi
クラスのメソッドをインスタンス化せじ直接呼び出す
class User
@@count(クラス変数) = 0
VERSION(クラス定数) = 1.1
def initialize(name)
@@count += 1
@name = name
end
def self.info
puts "#{VERSION}: User class. #{@@count} instances(インスタンスした数)"
end
User.info
p User::VERSION(外からも呼べる)
クラスの継承
class AdminUser(子クラス, Sub Class) < User(親クラス, Super Class)
継承したクラスのメソッドも使えるし、上書きもできる(オーバーライド)
end
メソッドのアクセス権 public, protected, private
newした時に呼ばれるinitializeメソッドと、クラスの外に書いたメソッドは自動的にprivateになる
class User
//クラス内からならprivateも呼び出せる
//レシーバーを指定できないからselfを書かないように
private
def sayPrivate
puts "Hi"
end
end
User.new.sayPrivate(できない)
Sub classでもprivateを使えたり、オーバーライドできるので注意
moduleで名前空間(名前が被らないように)
module Movie
VERSION = 1.1
def self.encode
puts "encode"
end
def self.loading
puts "loading"
end
end
Movie.encode
Movie.loading
p Movie::VERSION
moduleのもう1つの役割であるミックスイン
継承関係のない別々のクラスに同じメソッドを持たせたい時、その機能を持ったmoduleをつくる
module Debug
def info(selfをつけずに単にインスタンスメソッドにしてあげると、
それを他のクラスのインスタンスメソッドとしてはめ込むことができる)
puts "#{self.class} debug"
end
end
class Player
include Debug
end
class Monster
include Debug
end
Player.new.info → "Player debug"
例外処理
x = gets.to_i
begin
p 100 / x
Rescue => ex(例外が格納)
p ex.message(エラーのメッセージを表示)
p ex.class(エラーのクラスを表示)
puts "stop!"(自分でメッセージを表示)
ensure(エラーが起こっても続ける時)
puts "__END__"
end
※自分で例外処理を作る場合
class MyError < StandardError(rubyの標準クラスを継承) end
begin
if x == 3
raise MyError
end
p 100 /x
rescue MyError
puts "Error 3!"
rescue => ex(例外が格納)
p ex.message(エラーのメッセージを表示)
p ex.class(エラーのクラスを表示)
puts "stop!"(自分でメッセージを表示)
ensure(エラーが起こっても続ける時)
puts "__END__"
end