class Song
@@plays = 0
attr_reader :name, :artist, :duration
attr_writer :duration
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
@plays = 0
end
def durationInMinutes
@duration/60.0 # force floating point
end
def durationInMinutes=(value)
@duration = (value*60).to_i
end
def play
@plays += 1
@@plays += 1
"This song: #@plays plays. Total #@@plays plays."
end
end
irb(main):023:0> aSong = Song.new("Bicylops", "Fleck", 260)
=> #<Song:0x6603eec @duration=260, @artist="Fleck", @name="Bicylops", @plays=0>
irb(main):024:0> aSong.inspect
=> "#<Song:0x6603eec @duration=260, @artist=\"Fleck\", @name=\"Bicylops\", @plays=0>"
irb(main):025:0> aSong.to_s
=> "#<Song:0x6603eec>"
irb(main):026:0> s1 = Song.new("Song1", "Artist1", 234)
=> #<Song:0x64e2004 @duration=234, @artist="Artist1", @name="Song1", @plays=0>
irb(main):027:0> s2 = Song.new("Song2", "Artist2", 345)
=> #<Song:0x64de404 @duration=345, @artist="Artist2", @name="Song2", @plays=0>
irb(main):028:0> s1.play
=> "This song: 1 plays. Total 1 plays."
irb(main):029:0> s2.play
=> "This song: 1 plays. Total 2 plays."
irb(main):030:0> s1.play
=> "This song: 2 plays. Total 3 plays."
irb(main):031:0> s1.play
=> "This song: 3 plays. Total 4 plays."
irb(main):032:0>
class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end
end
irb(main):038:0> aSong = KaraokeSong.new("My Way", "Sinatra", 225, "And now, the...")
=> #<KaraokeSong:0x64d14e8 @lyrics="And now, the...", @duration=225, @artist="Sinatra", @name="My Way", @plays=0>
irb(main):039:0> aSong.to_s
=> "#<KaraokeSong:0x64d14e8>"
irb(main):040:0>
class SongList
MaxTime = 5*60 # 5 minutes
def SongList.isTooLong(aSong)
return aSong.duration > MaxTime
end
end
irb(main):030:0> song1 = Song.new("Bicylops", "Fleck", 260)
=> #<Song:0x64eea5c @artist="Fleck", @plays=0, @name="Bicylops", @duration=260>
irb(main):031:0> SongList.isTooLong(song1)
=> false
irb(main):032:0> song2 = Song.new("The Calling", "Santana", 468)
=> #<Song:0x64e84cc @artist="Santana", @plays=0, @name="The Calling", @duration=468>
irb(main):033:0> SongList.isTooLong(song2)
=> true
irb(main):034:0>
class Logger
private_class_method :new
@@logger = nil
def Logger.create
@@logger = new unless @@logger
@@logger
end
end
irb(main):021:0> Logger.create
=> #<Logger:0x66c9d54>
irb(main):022:0> Logger.create
=> #<Logger:0x66c9d54>
irb(main):023:0>
class Accounts
attr_reader :balance # accessor method 'balance'
protected :balance # and make it protected
def greaterBalanceThan(other)
return @balance > other.balance
end
private
def debit(account, amount)
account.balance -= amount
end
def credit(account, amount)
account.balance += amount
end
public
#...
def transferToSavings(amount)
debit(@checking, amount)
credit(@savings, amount)
end
#...
end
irb(main):028:0> accounts = Accounts.new
=> #<Accounts:0x6554bb8>
irb(main):029:0> accounts.balance
NoMethodError: protected method `balance' called for #<Accounts:0x6554bb8>
from (irb):29
from :0
irb(main):030:0>