トップ 最新の日記 ユーザー登録 ログイン ヘルプ

のびのびなRuby日記 このページをアンテナに追加 RSSフィード

2007-09-28

クラスに対して動的にメソッドを追加する練習  クラスに対して動的にメソッドを追加する練習 - のびのびなRuby日記 を含むブックマーク はてなブックマーク -  クラスに対して動的にメソッドを追加する練習 - のびのびなRuby日記  クラスに対して動的にメソッドを追加する練習 - のびのびなRuby日記 のブックマークコメント

#song.rb
class Song
  attr_accessor :name, :artist
  def initialize(name, artist)
    @name = name
    @artist = artist
  end
end

Songクラスにshow_infoというインスタンスメソッドを動的に追加してみます。

irb(main):001:0> load 'song.rb'
=> true
// Songオブジェクトを二つ生成します。
irb(main):002:0> s1 = Song.new("桜の時", "aiko")
=> #<Song:0x6c480 @name="桜の時", @artist="aiko">
irb(main):003:0> s2 = Song.new("Hello Another Way -それぞれの場所-", "the brilliant green")
=> #<Song:0x5e5b0 @name="Hello Another Way -それぞれの場所-", @artist="the brilliant green">

// Songクラスにshow_infoメソッドがないのでエラーになります。
irb(main):004:0> s1.show_info
NoMethodError: undefined method `show_info' for #<Song:0x6c480 @name="桜の時", @artist="aiko"> from (irb):5
// s1同様にエラーになります。
irb(main):005:0> s2.show_info
NoMethodError: undefined method `show_info' for #<Song:0x5e5b0> from (irb):6
// Songクラスに対して動的にshow_infoメソッドを追加します。
irb(main):006:0> Song.class_eval do
irb(main):007:1*   def show_info
irb(main):008:2>     return "Title: #{self.name} -- Artist: #{self.artist}"
irb(main):009:2>   end
irb(main):010:1> end
=> nil
// Songクラスにshow_infoメソッドを追加したので、show_infoメソッドを呼び出してもエラーになりません。
irb(main):011:0> s1.show_info
=> "Title: 桜の時 -- Artist: aiko"
irb(main):012:0> s2.show_info
=> "Title: Hello Another Way -それぞれの場所- -- Artist: the brilliant green"
// s1とs2のshow_infoの振る舞いを変えてみます。
irb(main):016:0> def s1.show_info
irb(main):017:1>   return "#{self.name} / #{self.artist}"
irb(main):018:1> end
s1がshow_infoメソッドを呼び出したときは曲名とアーティスト名がシンプルに表示される。
irb(main):019:0> s1.show_info
=> "桜の時 / aiko"

// s2オブジェクトに対してshow_infoメソッドを再定義
irb(main):020:0> def s2.show_info
irb(main):021:1>   return "曲名: #{self.name}  アーティスト名: #{self.artist}"
irb(main):022:1> end
=> nil
s2がshow_infoを呼び出した時はs1と異なる表示のされかたをしている。
irb(main):023:0> s2.show_info
=> "曲名: Hello Another Way -それぞれの場所-  アーティスト名: the brilliant green"

Rubyオブジェクト毎にメソッドを定義て、これを特異メソッドと言います。