2007-09-28
■ クラスに対して動的にメソッドを追加する練習

#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"
コメントを書く