オブジェクトを更に極める! (3/5)
作成:2012-08-25 20:28
更新:2012-08-25 20:28
更新:2012-08-25 20:28
■クラスメソッドとクラス変数
クラスに用意されているメソッドや変数は、基本的に「インスタンスを作って、そこから利用する」というものでした。が、クラスの中には、「インスタンスを作らず、クラスから直接メソッドなどを呼び出せたほうが便利」というものもあります。例えば、数値の計算をするメソッドなどを想像してみましょう。引数に数字を渡すと計算した結果を返すようなメソッドです。これ、別にインスタンスを作る意味、ないでしょう?
こういう場合に用いられるのが、「クラスメソッド」というものです。これは、文字通り、クラスから(インスタンスを作らず)直接呼び出せるメソッドです。これにはいくつか書き方があるのですが、ざっと以下のものだけ覚えておけば十分使えるようになるでしょう。
・クラスメソッドの定義(1)
(1)は、class Hogeというクラスの定義内に書いてもいいですし、それとは別の場所に書いてもかまいません。(2)は、class Hogeというクラス定義の中に書くのが前提です。例えばHogeというクラスにheloというクラスメソッドを用意するなら、class Hogeの中に「def Hoge.helo」あるいは「def self.helo」というようにしてメソッドを定義すればいい、というわけです。
が、クラスメソッドでも、何らかの値をクラス内に保持しておきたい、ということはあるでしょう。こうした場合には、「クラス変数」というものを使います。これは、以下のように記述します。
では、サンプルとして、消費税計算のクラスを作って計算をする例を下にあげておきましょう。クラスTaxには、税込価格と税額のそれぞれを計算して返すクラスメソッドがあります。また税率は@@zeiritsuというクラス変数に保管されており、この値を変更するself.zeiritsu=というクラスメソッドも定義されています。こうした純粋に計算する機能だけを提供するようなクラスは、クラスメソッドとして機能を実装したほうが便利なのがよくわかりますね。
こういう場合に用いられるのが、「クラスメソッド」というものです。これは、文字通り、クラスから(インスタンスを作らず)直接呼び出せるメソッドです。これにはいくつか書き方があるのですが、ざっと以下のものだけ覚えておけば十分使えるようになるでしょう。
・クラスメソッドの定義(1)
def クラス . メソッド・クラスメソッドの定義(2)
……実行する処理
end
def self.メソッド名
……実行する処理
end
(1)は、class Hogeというクラスの定義内に書いてもいいですし、それとは別の場所に書いてもかまいません。(2)は、class Hogeというクラス定義の中に書くのが前提です。例えばHogeというクラスにheloというクラスメソッドを用意するなら、class Hogeの中に「def Hoge.helo」あるいは「def self.helo」というようにしてメソッドを定義すればいい、というわけです。
●クラス変数とは?
クラスメソッドは、クラスから直接呼び出される関係で、インスタンスメソッドとは決定的に異なる点があります。それは、「インスタンス変数にアクセス出来ない」という点です。考えてみれば、インスタンスを作らずに呼び出すのですから使えないのは当然ですね。が、クラスメソッドでも、何らかの値をクラス内に保持しておきたい、ということはあるでしょう。こうした場合には、「クラス変数」というものを使います。これは、以下のように記述します。
@@変数名
インスタンス変数は、「@変数名」というように書きましたが、クラス変数は「@@変数名」というように@@が頭に付けられます。このクラス変数は、クラスが利用できる間(つまりスクリプトを終了するまでずっと)値を保持し続けます。では、サンプルとして、消費税計算のクラスを作って計算をする例を下にあげておきましょう。クラスTaxには、税込価格と税額のそれぞれを計算して返すクラスメソッドがあります。また税率は@@zeiritsuというクラス変数に保管されており、この値を変更するself.zeiritsu=というクラスメソッドも定義されています。こうした純粋に計算する機能だけを提供するようなクラスは、クラスメソッドとして機能を実装したほうが便利なのがよくわかりますね。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
class Tax @@zeiritsu = 0.05 def self.zeiritsu= (n) @@zeiritsu = n end def self.priceWithTax(price) return (price * (1.0 + @@zeiritsu)).to_i end def self.tax(price) return (price * @@zeiritsu).to_i end end price = 12300 puts("価格:" + price.to_s) puts("税込:" + Tax.priceWithTax(price).to_s) puts("税額:" + Tax.tax(price).to_s) Tax.zeiritsu = 0.1 puts("※消費税が10%にあがると……") puts("税込:" + Tax.priceWithTax(price).to_s) puts("税額:" + Tax.tax(price).to_s)
※関連コンテンツ