mike、mikeなるままに…

プログラムに関してぬるま湯のような記事を書きます

初めてRubyのモジュールを書いてみた

こんにちわ、みけです。

前回の記事『Rubyのmixinの話を読んでいたら、何故かjavaを書いていた』はあまりにも

rubyに対して失礼なので、

初心者らしく、ちゃんとmoduleを作ってみました。

ところで、僕の感心事は前回の記事でも書いたように、

rubyのmoduleはインスタンス変数にアクセスすることができるのか?

ということです。

で、結論から言えば、

rubyのmoduleはインスタンス変数にアクセスできました

となります。

moduleを作成

having_title.rb
1
2
3
4
5
6
7
8
9
10
# -*- codig: utf-8 -*-

module HavingTitle
  def title=(t)
    @title = t
  end
  def title
    @title
  end
end

moduleHavingTitleは単純にタイトルというものに

アクセスすることができるモジュールです。

先程も書きましたが、僕の疑問は@titleフィールドに、

インスタンス化することができないmoduleがアクセすることができるのか

ということです。

moduleincludeしたclassを作成

book.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-

require './having_title'

class Book
  include HavingTitle

  attr_accessor :price

  def initialize(title, price)
    @price = price
    self.title = title
  end

  def print_info
    "Book[title : #{@title}, price : #{@price}]"
  end
end

タイトルというものを持っていそうなクラスということで

Bookというクラスをつくりました。

後はBookクラスをインスタンス化して、

フィールド@titleにアクセスできるかどうか確認出来れば

僕の疑問は解決出来ます。

irbで動作を確認

あ、まだrubyでのテストの書き方知らないので、

ここはirbで勘弁して下さい。

book.rb
1
2
3
4
5
6
irb(main):001:0> require './book'
=> true
irb(main):002:0> book = Book.new 'anti-oedipus', 4000
=> #<Book:0x007f90890b6e38 @price=4000, @title="anti-oedipus">
irb(main):003:0> book.print_info
=> "Book[title : anti-oedipus, price : 4000]"

というわけで、特に何のエラーも出ることなく、

フィールド@titleにアクセスできているようですね。

モジュールの機能の一つとしてのMix-in

まあ、『初めてのRuby』にはモジュールについて次のように書いてあります。

モジュールはクラスに似ています。モジュールは「インスタンス化できないクラス」のようなものです。 ClassクラスはModuleのサブクラスですから、「クラス = モジュール + インスタンス化能力」と言ってもよさそうです。 (Yugui著『初めてのRuby』(オライリー・ジャパン、2008年、p.159))

Javaしかわからない(Javaも詳しくはわからない)僕には、

abstract classと考えておけばよさそうです。

で、複数のモジュールを継承できるので、

なんか、アレですね…