前へ | 次へ |
(例)
--------------------------------------------------------------------------
class HelloWorld # class文
def initialize(myname="Ruby") # initializeメソッド
@name=myname # インスタンス変数の初期化
end
def hello # インスタンスメソッド
print "Hello, world. I am ", @name, ".\n"
end
end
bob = HelloWorld.new("Bob")
alice = HelloWorld.new("Alice")
ruby = HelloWorld.new
bob.hello
--------------------------------------------------------------------------
●class文
class クラス名
クラスの定義
end
※クラス名は、必ず大文字で始めなければならない。
●initializeメソッド
newメソッドによってオブジェクトを生成すると、initializeメソッドが
実行される。
bob = HelloWorld("Bob")
オブジェクトを生成すると、initializeメソッドに"Bob"が渡される。
引数を渡さなかった場合、自動的に"Ruby"が渡される。
●インスタンス変数とインスタンスメソッド
@で始まる変数をインスタンス変数という。
インスタンス変数はインスタンスメソッドから参照することが可能。
●アクセスメソッド
インスタンス変数にアクセスするためにメソッドを定義する必要がある。
(例)
class HelloWorld
:
def name
return @name
end
def name=(value)
@name = value
end
end
アクセスメソッドの定義
┌──────────┬─────────────────────────┐
│定義 │意味 │
├──────────┼─────────────────────────┤
│attr_reader :name │参照のみ可能にする(nameメソッドを定義する) │
│attr_writer :name │変更のみ可能にする(name=を定義する) │
│attr_accessor :name │参照と変更の両方を可能にする(上記2つを定義する)│
└──────────┴─────────────────────────┘
●クラスメソッド
クラスメソッドの定義の仕方
(a)
「def クラス名.メソッド名 〜 end」と書く場合
class HelloWorld
def HelloWorld.Hello(name)
print name, "said hello.\n"
end
end
HelloWorld.hello("John")
(b)
「class << クラス名 〜 def メソッド名 〜 end end」と書く場合
class HelloWorld
:
end
class << HelloWorld
def Hello(name)
print name, "said Hello.\n"
end
end
HelloWorld.hello("John")
(c)
「class クラス名 〜 def self.メソッド名 〜 end end」と書く場合
class HelloWorld
def self.hello(name)
print name, "said hello.\n"
end
end
HelloWorld.hello("John")
●定数
class HelloWorld
Version = "1.0"
end
p HelloWorld::Version #=> "1.0"
●クラス変数
「@@」で始まる変数。
そのクラスのすべてのインスタンスで共有できる変数。
(例)
class HelloCount
@@count = 0
def HelloCount.count
@@count
end
def initialize(myname="Ruby")
@name = myname
end
def hello
@@count += 1
print "Hello, world. I am ", @name, ".\n"
end
end
bob = HelloCount.new("Bob")
alice = HelloCount.new("Alice")
ruby = HelloCount.new
p HelloCount.count #=> 0
bob.hello
alice.hello
ruby.hello
p HelloCount.count #=> 3
●クラスの拡張
すでに定義されているクラスにメソッドを追加することも可能。
(例)
-------------------------------------------------
class String
def count_word
ary = self.split(/\s+/)
return ary.size
end
end
str = "Just Another Ruby Newbie"
p str.count_world
-------------------------------------------------
●継承
既存のクラスに変更を加えず、新しい機能を追加したり、部分的に
カスタマイズしたりして新しいクラスを作成する。
class クラス名 < スーパークラス名
クラスの定義
end
(例)
----------------------------------------------------------
class RingArray < Array
def [](i)
idx = i % size
super(idx)
end
end
eto = RingArray[[ "子", "丑", "寅", "卯", "辰", "巳",
"午", "未", "申", "酉", "戌", "亥"]
p eto[6] #=> "午"
p eto[11] #=> "亥"
p eto[15] #=> "卯"
p eto[-1] #=> "亥"
●メソッドの呼び出し制限
・public
メソッドをインスタンスメソッドとして使えるように公開する
・private
メソッドをクラスの内部だけで使えるようにする
(レシーバを指定してよびだせないようにする)
・protected
メソッドをクラスの内部から使えるようにする。また、同一
クラスないではインスタンスメソッドとしても使えるようにする