class class_name [ < super_class ] expression... [rescue [error_type, ...] [=> evar] [then] expression...]... [else expression...]... [ensure expression...] end
class はクラス を定義します。クラス名は英大文字で始まります。下記の例は MyClass クラスを定義しています。MyClass クラスはインスタンス変数 @name を持ちます。また、メソッドとして @name に値を設定する setName() と、@name の値を参照する getName() を持ちます。
class MyClass @name = "" def setName(str) @name = str end def getName return @name end end
new 演算子でオブジェクトを生成し、setName() メソッドを呼び出して名前を設定し、getName() メソッドでその値を参照しています。
obj = MyClass.new obj.setName("Tanaka") puts obj.getName
< はクラスを継承する際の親クラス(スーパークラス)を指定します。下記の例で、MyMember2クラスは、MyMemberクラスを継承するサブクラスとして定義されています。MyMember2クラスは、MyMemberクラスが持つ $nameプロパティ、setName()メソッド、getName()メソッドを引き継ぎ、加えて、$addrプロパティ、setAddr()メソッド、getAddr()メソッドを持ちます。
class MyMember @name = "" def setName(str) @name = str end def getName return @name end end class MyMember2 < MyMember @addr = "" def setAddr(str) @addr = str end def getAddr return @addr end end obj = MyMember2.new obj.setName("Tanaka") obj.setAddr("Tokyo") puts obj.getName puts obj.getAddr
スーパークラスを省略した場合は、Object クラスのサブクラスとして作成されます。
class MyClass # class MyClass < Object と同義 end
クラスをネスト(入れ子)にすることができます。外側クラスと内側クラスに継承関係はありませんが、いくつかのクラスをグルーピングする際に役立ちます。
class Foo class Bar end end obj = Foo::Bar.new
下記の様にして、すでに作成済みのクラスに対して、メソッドや変数などを追加(上書き)することができます。
class MyClass # クラスを定義 def hello puts "Hello!" end end class MyClass # 同盟のクラスを定義 def hello # 既存のメソッドを上書き puts "HELLO!!!" end def bye # 既存クラスにメソッドを追加 puts "Bye!" end end
class << instance expression... [rescue [error_type, ...] [=> evar] [then] expression...]... [else expression...]... [ensure expression...] end
<< を用いて、すでに作成済みのオブジェクトに対して、一時的に新たなメソッド等を追加定義することができます。下記の例では、Fooクラスのオブジェクト obj に対して新たなメソッド hello を追加定義しています。
class Foo end obj = Foo.new class << obj def hello puts "Hello!" end end obj.hello
module module_name expression... [rescue [error_type, ...] [=> evar] [then] expression...]... [else expression...]... [ensure expression...] end
module はモジュールを定義します。モジュールはクラスと似ていますが、それ自体ではインスタンスを生成せず、インスタンス変数も持ちません。代わりに、他のクラスにインクルード(include)されて使用されます。これにより、様々なクラスにモジュールの機能を取り込むことができます。
module Foo # Fooモジュールを定義 def add(x, y) return x + y end end class Bar include Foo # Fooモジュールを取り込む end obj = Bar.new # Barのインスタンスであっても puts obj.add(3, 5) # Fooモジュールのメソッドadd()を利用できる