Ruby のお勉強 - クラス -
公開日:2014-12-28 更新日:2019-05-13
[Ruby]
クラス
class TestClass
#コンストラクタ
def initialize
p "initialize"
end
def test
"Hello"
end
end
obj = TestClass.new
p obj.test
"initialize"
"Hello"
デストラクタはない。メソッドは普通に定義すると public になる。
class TestClass
public
def test1
"test1"
end
def test2
"test2"
end
private
def test3
"test3"
end
protected
def test4
"test4"
end
end
obj = TestClass.new
p obj.test1
p obj.test2
#p obj.test3 #エラー
#p obj.test4 #エラー
"test1"
"test2"
private にしたい場合は、メソッドの前の行に private と書く。private 以降のメソッドは、全て private となる。
途中で public または protected を書くことで変更することも可能。
class TestClass
def getValue
@value
end
def setValue(value)
@value = value
end
end
obj = TestClass.new
obj.setValue 5
p obj.getValue
5
インスタンス変数は @変数名と書く。使用する前に宣言する必要はない。デフォルトの可視性は private。
class TestClass
attr :value1 #読み込み専用。書き込むとエラー
attr_reader :value2 #読み込み専用。書き込むとエラー
attr_accessor :value3 #読み書き可能
attr_writer :value4 #書き込み専用。読み込むとエラー
#複数定義することもできる
attr :valueA, :valueB
def initialize
@value1, @value2, @value3, @value4, @value5 = [1, 1, 1, 1, 1]
end
end
obj = TestClass.new
#読み込み専用
#obj.value1 = 5 #エラー
p obj.value1
#obj.value2 = 5 #エラー
p obj.value2
#読み書き可能
obj.value3 = 3
p obj.value3
#書き込み専用
obj.value4 = 4
#p obj.value4 #エラー
##src|1
1
3
##/e##
attr を使って、インスタンス変数のアクセス権限を定義できる。定義する時は、シンボルを使う。
また、attr でインスタンス変数が定義されている訳ではない。
class TestClass
def self.test
"Hello"
end
end
p TestClass.test
"Hello"
クラスメソッドは、メソッド名の前に self. を付ける。class TestClass
@@value = 0
def getValue
@@value
end
def addValue
@@value = @@value + 1
end
def self.getValue2
@@value
end
end
obj1 = TestClass.new
obj1.addValue
obj1.addValue
p obj1.getValue
obj2 = TestClass.new
p obj2.getValue
p TestClass.getValue2
2
2
2
クラス変数は @@変数名 と書く。クラスの外からはアクセスできない。class TestClass
def test1
p "test1"
end
def test2
p "test2"
end
end
class TestClassEx < TestClass
def test1
super
p "test1Ex"
end
def test2
p "test2Ex"
end
end
obj = TestClassEx.new
obj.test1
obj.test2
"test1"
"test1Ex"
"test2Ex"
クラスを継承する時は、< を使う。super で、親のメソッドを実行できる。
オーバーライドする時は、メソッド名を親と同じにするだけで良い。
class TestClass
def showValue
p @value
end
end
class TestClassEx < TestClass
def test2
showValue
@value = 10
showValue
end
end
obj = TestClassEx.new
obj.test2
nil
10
メソッドは super を使って親で定義されたメソッドを呼び出せるけど、インスタンス変数は、親子で共通の変数となる。
class TestClass
attr_accessor :value
end
class TestClassEx
end
obj = TestClass.new
obj.value = 1
p obj.value
objEx = TestClassEx.new
#objEx.value = 2 #エラー
#p objEx.value #エラー
1
attr によるアクセス権限は継承されない。あくまでもアクセス権限を定義しているだけなので、
継承先のクラスでインスタンス変数にアクセスするとエラーになる。
class TestClass
attr_accessor :value
end
class TestClassEx
attr_reader :value
end
obj = TestClass.new
obj.value = 1
p obj.value
objEx = TestClassEx.new
#objEx.value = 2 #エラー
p objEx.value
1
nil
アクセス権限は継承して上書き可能。class TestClass
@@obj = TestClass.new
def self.getInstance
@@obj
end
def test
p "Hello"
end
end
obj = TestClass.getInstance
obj.test
"Hello"
クラスメソッド(staticメソッド)は、メソッド名の前に self. を付ける。class TestClass
def self.test1
@a = 5
end
def self.test2
p @a
#p @@a #エラー
end
def test3
p @a
end
end
TestClass.test1
TestClass.test2
TestClass.new.test3
5
nil
クラスメソッドの中でインスタンス変数を使うと、クラス変数のような動作になる。但し、クラス変数として @@変数名 で使うことはできない。