Rubyで構造体を定義する
タグ: ruby / 初版公開: 2013-11-30

Rubyに構造体という概念は存在しない。しかしStructクラスが用意されており、構造体ライクなクラスを簡潔に記述できるようになっている。Rubyにおける構造体は、メンバに値を設定するコンストラクタと、メンバへのアクセサメソッドが定義されただけのクラスである。

構造体を定義するにはStruct.newを呼ぶ。このコンストラクタは少しばかり異色で、Structのサブクラスを新たに作って返す。例えば年齢と性別をメンバとして持つDog構造体は以下のように定義できる。

Dog = Struct.new(:age, :sex)

Dog構造体にはメンバに値を設定するコンストラクタが定義される。以下のように呼び出すことで、生成と同時にメンバに値を設定できる。

Dog = Struct.new(:age, :sex)
dog = Dog.new(10, :male)
p dog # => <struct Dog age=10, sex=:male>

メンバへのアクセスは、メソッド呼び出しの形式でも、ハッシュ風の方法でも、どちらも可能になっている。なお、メンバの一覧はクラスメソッドのmembersメソッドで取得することができる。またeach_pairメソッドにより、ハッシュのeachのようにメンバ名と値を取り出すことができる。

Dog = Struct.new(:age, :sex)
dog = Dog.new

dog.age = 10
dog.sex = :male

p dog[:age] # => 10
p dog[:sex] # => :male

p dog.members # => [:age, :sex]

dog.each_pair{|k, v|
	puts k, v
}

Struct.newにブロックを渡して、その中にメソッドを定義することで、構造体にメソッドを持たせることもできる。とはいえ、ここまで来ると、果たして構造体である必要があるのかどうか、若干疑問ではある。

Dog = Struct.new(:age, :sex) {
	def baw
		puts 'baw!'
	end
}
dog = Dog.new
dog.baw # => 'baw!'