クラスは処理内容を定義した設計図、いわば型枠のようなものでその型枠自体の処理内容をクラスメソッドで決めていきます。クラスメソッドはクラス自体をレシーバとしているので「クラス名.メソッド名」と記述すればクラスから直接呼び出しを行うことができるメソッドとなります。
クラスメソッドの作り方は大きく分けて2種類ありますが、まずは特異クラス定義という記述でクラスメソッドを作ってみます。
特異クラス定義
1 2 3 |
class << クラス名 クラスメソッドの内容(def メソッド名 ~処理内容~ end) end |
この定義の仕方を特異クラス定義(形式)と呼びます。それでは例としてクラスメソッドを作っていきましょう。
1 2 3 4 5 6 7 8 |
class HelloRuby class << HelloRuby def info puts "HelloRuby Class" end end end HelloRuby.info |
HelloRuby Class
これで無事「HelloRuby(クラス名).info(メソッド名)」で処理を呼び出すことができるようになりました。今回の場合は単にクラス名を表示させるクラスメソッドを作ってみました。
また、「self」を使ってクラスメソッドを作ることもできます。「self」はレシーバを指すので今回の場合、infoメソッドが呼ばれた際のレシーバはクラス自身である「HelloRuby」ということになります。
1 2 3 4 5 6 7 8 |
class HelloRuby class << self def info puts "HelloRuby Class" end end end HelloRuby.info |
HelloRuby Class
ちなみに「class << クラス名」と記述すれば、クラス定義(class クラス名 ~ end)の外にもクラスメソッドを記述することができますが、「class << self」と記述してクラス定義の外に書いてしまうと「self」が何を指しているのかわからなくなるのでクラスメソッドの定義はできません。
特異メソッド
特異メソッド(形式)でクラスメソッドを定義する場合は下記のような記述を行います。
1 2 3 |
def クラス名.メソッド名 クラスメソッドの内容 end |
具体的には下記のように記述をしていきます。
1 2 3 4 5 |
class HelloRuby def HelloRuby.info # または「self.info」 puts "HelloRuby Class" end end |
HelloRuby Class
また、この記述方法もさっきと同じように「self」を使って書くこともできますが、「self」を使った場合はクラス定義の外には記述できないので注意が必要です。
クラス変数
クラス変数とはクラス全体で値を共有、保持できる変数のことをいいます。クラス変数は「@@変数」といった記述をします。今回は例としてオブジェクトが定義された回数をカウントするスクリプトをみていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class HelloRuby @@count = 0 # カウンターの初期化 def initialize @@count += 1 end def HelloRuby.count puts "#{@@count}回" end end HelloRuby.count callcount1 = HelloRuby.new callcount2 = HelloRuby.new callcount3 = HelloRuby.new HelloRuby.count |
0回 3回
クラスを「newメソッド」で初期化した際には「initializeメソッド」が自動的に呼び出されるのでそれを利用して「@@count」に呼び出しの都度1をプラスしています。今回は3回「newメソッド」でオブジェクトを定義しているので、無事17行目では「3回」と出力されましたね。
定数
クラス内では定数も変数と同じように定義できます。定数は大文字から始めるという決まりがあり、慣習的には全て大文字といった記述がされていることが多いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class HelloRuby VERSION = 1.0 def HelloRuby.ver puts VERSION end def ver1 puts VERSION end end p HelloRuby::VERSION HelloRuby.ver HelloRuby.new.ver1 |
1.0 1.0 1.0
クラス内で定義した定数は「クラス名::定数」のような書き方を行えばクラスの外から呼び出すことが可能です。また、クラスメソッドやインスタンスメソッドからも普通に呼び出せます。
コメントを残す