[ruby-list:46052] プログラミングRuby第2版 言語編 p26、p29サンプルソースについて
From:
eiichi_maekawa@...
Date:
2009-06-04 09:47:51 UTC
List:
ruby-list #46052
はじめまして。
三菱重工業株式会社長崎造船所に勤めています前川と申します。
部内でRUBYを使用したブラウザベースのシステムを作成することになり、本書を
参考に勉強を始めたばかりです。
記載されているサンプルコードはunixベースと思われますが、
windows 版に修正しながら、確認しています。
Rubyに関してはまったくの初心者です。
対処方法につき、ご教示いただきますよう、よろしくお願いします。
今使用しているRubyは、
C:\Apache2.2\htdocs\ruby_prg\em_ruby>ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
O/Sは、windows_xpです。
質問1.
本書p26に記載のattr_readerを使用しましたが、エラーとなりました。
エラーメッセージは、
C:\Apache2.2\htdocs\ruby_prg\em_ruby>ruby em_song2r1.rb
Content-Type: text/html
em_song2r1.rb:13: undefined local variable or method `artist' for
Song:Class (NameError)
です。
コードは、以下です。
−−−−−−−−−−−−ソースコード−−−−−−−−−
#!C:/Ruby/bin/ruby.exe
print "Content-Type: text/html\n\n"
#
#プログラミングRuby第2版 言語編 サンプルl
#2009/06/03 E.MAEKAWA
#実行するI.E.のアドレス
#http://localhost:8080/ruby_prg/em_ruby/em_tutorial.rb
#
#Songクラス
class Song
attr_reader(name,artist,duration) #undefined local variable or method
`duration' for Song:Class (NameError)が生じる。原因不明
# name の初期化
#def name
# @name
#end
#artistの初期化
#def artist
# @artist
#end
#durationの初期化
#attr_writer(duration) #undefined local variable or method `duration' for
Song:Class (NameError)が生じる。原因不明
def duration_in_minutes
@duration/60.0 # 浮動小数点に強制的に変換
end
def duration_in_minutes=(new_duration)
@duration = (new_duration*60).to_i
end
#def duration=(new_duration)
# @duration = new_duration
#end
#データを、設定する。
def initialize(name,artist,duration)
@name = name
@artist = artist
@duration = duration
end
#データを整形化して、出力する。
#形式;Song: #@name--#@artist (#@duration)
def to_s
"Song: #@name--#@artist (#@duration)"
end
end
# Song クラスを継承し、歌詞を追加する。
# Songのサブクラス
#
class KaraokeSong < Song
# 初期化処理
#attr_reader :name, :artist, :duration, :lirisc
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end
#文字列変換:superクラスのto_sに歌詞を追加
#
def to_s
super + " [#@lyrics]"
end
end
song = Song.new("Bicylops","Fleck", 660) #曲名、奏者、演奏時間分を設定
puts song.to_s
puts song.duration_in_minutes
puts song.inspect
song.duration_in_minutes = 5.5
puts song.to_s
#メイン処理 カラオケ
karaoke = KaraokeSong.new("My Way","Sinatra",255,"And now, the end is
near...")
puts karaoke.to_s
puts song.duration_in_minutes
puts karaoke.inspect
karaoke.duration_in_minutes = 4.2
puts song.duration_in_minutes
puts karaoke.to_s
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
質問2.
同本書P.29クラスメソッド記載のコーディングをしても、attr_readerと同様に
エラーとなりました。
対処方法につき、教えてください。
エラーメッセージは、
C:\Apache2.2\htdocs\ruby_prg\em_ruby>ruby emSongWithClassMethod.rb
Content-Type: text/html
emSongWithClassMethod.rb:83:in `is_too_long': undefined method `duration'
for #<Song:0x2b4f490> (NoMethodError)
from emSongWithClassMethod.rb:88
です。
コードは、以下です。
−−−−−−−−−−−−−−−ソースコー
ド−−−−−−−−−−−−−−−−−−−−−−−−−
#!C:/Ruby/bin/ruby.exe
print "Content-Type: text/html\n\n"
require 'rubygems'
#
#プログラミングRuby第2版 言語編 サンプルl
#2009/06/03 E.MAEKAWA
#実行するI.E.のアドレス
#http://localhost:8080/ruby_prg/em_ruby/em_tutorial.rb
#
#Songクラス
class Song
#attr_reader(name,artist,duration)##undefined local variable or method
`duration' for Song:Class (NameError)が生じる。原因不明
@@plays = 0 # クラス変数 回数
# name の初期化
def name
@name
end
#artistの初期化
def artist
@artist
end
#durationの初期化
#attr_writer(duration) #undefined local variable or method `duration' for
Song:Class (NameError)が生じる。原因不明
def duration_in_minutes
@duration/60.0 # 浮動小数点に強制的に変換
end
def duration_in_minutes=(new_duration)
@duration = (new_duration*60).to_i
end
#def duration=(new_duration)
# @duration = new_duration
#end
#データを、設定する。
def initialize(name,artist,duration)
@name = name
@artist = artist
@duration = duration
@plays = 0
end
# クラス変数で、回数を記録する。
def play
@plays += 1 # @plays = @plays + 1 と同じ
@@plays += 1 # @@plays= @@plays + 1 と同じ
puts "This song: "+@plays.to_s+" plays. Total # "+@@plays.to_s+"
plays."
end
#データを整形化して、出力する。
#形式;Song: #@name--#@artist (#@duration)
def to_s
"Song: #@name--#@artist (#@duration)"
end
end
# Song クラスを継承し、歌詞を追加する。
# Songのサブクラス
#
class KaraokeSong < Song
# 初期化処理
#attr_reader :name, :artist, :duration, :lirisc
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end
#文字列変換:superクラスのto_sに歌詞を追加
#
def to_s
super + " [#@lyrics]"
end
end
#SongListクラス 曲の長さを判定する
class SongList
MAX_TIME = 5*60 #5分以下の曲を選択する。
def SongList.is_too_long(song)
return song.duration > MAX_TIME
end
end
song = Song.new("Bicylops","Fleck", 299) #曲名、奏者、演奏時間分を設定
puts SongList.is_too_long(song).to_s
#if SongList.is_too_long(song)
#puts "5分以上です。"+song1.duration_in_minutes.to_s+"のため、演奏できませ
ん。"
# else
# song.play
# song.play
#end
# song.duration_in_minutes = 5.5
# puts song.duration_in_minutes
puts SongList.is_too_long(song)
#if SongList.is_too_long(song) puts "5分以上で
す。"+song.duration_in_minutes.to_s+"のため、演奏できません。"
# else
# song.play
#end
#メイン処理 カラオケ
karaoke = KaraokeSong.new("My Way","Sinatra",255,"And now, the end is
near...")
puts SongList.is_too_ong(karaoke)
#if SongList.is_too_long(karaoke)
# puts "5分以上です。"+song1.duration_in_minutes.to_s+"のため、演奏できま
せん。"
#else
# karaoke.play
#end
#puts song.duration_in_minutes
#puts karaoke.inspect
puts SongList.is_too_long(karaoke)
#if SongList.is_too_long(karaoke)
# puts "5分以上です。"+song1.duration_in_minutes.to_s+"のため、演奏できま
せん。"
#else
# karaoke.play
# karaoke.duration_in_minutes = 5.0
# puts karaoke.duration_in_minutes
# puts karaoke.to_s
# karaoke.play
#end
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−