RGSS基本講座(7)
今回より少し書き方を変えてみたり。たぶん、今までよりも見やすくなるんじゃないかな。
目次
モジュール
モジュールはクラスとよく似ています。
モジュールとクラスの違い
モジュールはクラスと違いインスタンスを持つことができません。したがって、インスタンスメソッドやインスタンス変数はありません。また、クラスメソッドとクラス変数に代わるものもありません。
メソッドは単にメソッドと表記され、クラスのときと若干使い方が違います。
クラス定数に代わるものとしてモジュール定数があります。
もう1つの違いは、モジュールは「継承」ができないことです。
気をつけましょう。
モジュールの利用法(1)
モジュール名.メソッド
モジュール名::メソッド
上記のどちらでも構いません。プリセットでは上のほうで統一されています。
もちろん、引数等は普通のメソッドと同様です。
この方法だと、どこからでも使える上に、メソッド名が他のクラスやモジュールと被っても問題なく利用できます。
よく使う関数等を定義するときに使います。
※この方法を使う場合はモジュール定義時に手続きが必要です。(後術)
また、モジュール定数の場合は
モジュール名::定数
の1つしかありません。定義時の手続きは不要です。
モジュールの利用法(2)
include モジュール名
メソッドも定数もクラス内に定義されたものと同様に扱うことができます。
この方法は、異なるクラスに共通するメソッドを提供するときに使います。つまり、擬似的にスーパークラスの役割を持たせます。
RGSS(もちろんRubyも)ではスーパークラスを1つしかもてないので、この方法でメソッドをまとめるとプログラムをすっきりさせることができます。
メソッド名が被った場合は次のような優先順位があります。
クラス→モジュール→スーパークラス→…
つまり、メソッド名が被ったときに意図したとおりに機能しないことがあります(要注意)。
ただ、RGSSにおいてこの方法を使うことはあまりありません。
モジュールの定義
モジュールの定義はクラスの定義とほぼ同じです。
module モジュール名
定数 = 値
def メソッド名 #引数を取ることも可能
…略
end
module_function :メソッド名 #※
end
※印の行が、メソッドを外部に公開するときの手続きです。
このときコロン":"とメソッド名の間は空白等を含めてはいけません。
プロパティ
プロパティという呼び名はRGSSで作られたものなのですが、存在自体はRubyにもあります。RGSS側でわかりやすくするために呼び名をつけたようです。
(補足)内部と外部
ここから先は「クラス内」や「クラス外」という表現がたくさんでてきますので、具体例を用いてあらかじめ確認しておきます。
まず、次のようなクラスを定義したとします。
class Foo
def initialize #初期化用のメソッド
@hensuu = "初期値"
end
def a
@hensuu = "hensuu"
end
end
そして次のようなプログラムを組んでみます。
bar = Foo.new
bar.a
bar.hensuu = "hensuu" #=>(エラー)
このとき、aというメソッドで行っている@hensuuへの代入はクラス内部の処理です。
bar.hensuu = "hensuu"はクラスの外部から@hensuuに代入しようとした場合の処理です。
※外部からの処理は手続きが必要です。ここでは手続きをしていないので、エラーになります。
インスタンス変数
基本的にインスタンス変数はクラスの外部からは値を見ること(参照)も変えること(代入)もできません。
しかし、クラス内にアクセスメソッドという特殊なメソッドを定義すると参照や代入が可能になります。
参照のみが可能になった状態の時、インスタンス変数は定数のような働きをします。
参照と代入の両方が可能になった状態の時をプロパティといいます。
代入のみが可能になった状態の時ももちろんありますが、具体的な置き換え例が思いつきません。
ゲッター
参照のみを可能にするメソッドをゲッターと言います。ゲットするという意味です。
クラス内に次のように定義します。
def 変数名
return @変数名
end
上記の方法はあまり使われず、実際は次のような略記を使います。
attr_reader :変数名
※モジュールの時と同様に、コロンのあとに空白を入れてはいけません。
セッター
代入のみを可能にするメソッドをセッターと言います。セットするという意味です。
クラス内に次のように定義します。
def 変数名=(foo)
@変数名 = foo
end
もちろん、引数のfooの名前は変えることができます。
ゲッターと同様に上記の方法はあまり使われず、実際は次のような略記を使います。
attr_writer :変数名
※コロンのあとに空白を入れてはいけません。
アクセサ
参照と代入の両方を可能にするメソッドをアクセサと言います。アクセスメソッドとも言いますが、アクセサのほうが一般的なようです。
クラス内にゲッターとセッターの両方を定義します。
def 変数名
return @変数名
end
def 変数名=(foo)
@変数名 = foo
end
もちろん、引数のfooの名前は変えることができます。
ゲッターやセッターと同様に上記の方法はあまり使われず、実際は次のような略記を使います。
attr_accessor :変数名
※コロンのあとに空白を入れてはいけません。
アクセサのほかにセッターやゲッターがあるのは、外部から間違えて変更すると困るインスタンス変数を保護したりするためです。
本来参照したり代入したりするべきではないインスタンス変数はアクセサを定義しないようにすることで、テストプレイ時にバグチェックができます。
定義する場所
これらのメソッドを定義する場所に決まりはありませんが、プリセットのように統一すると見やすくなるでしょう。
しばらく、期間が空きます。また次回。
コメント
コメントの投稿
トラックバック
http://rgss.blog26.fc2.com/tb.php/10-7d5ac247
この記事にトラックバックする(FC2ブログユーザー)