Tehtävä:
Luvun viimeisessä tehtävässä harjoitellaan luokkamuuttujien käyttämistä. Tehtävänäsi on luoda luokka Elain, johon tallennettaan jotain perustietoja eri eläimistä.
Määrittele luokkaan kaksi luokkamuuttujaa edellinen ja maara, jotka alustetaan arvoon "" ja 0. Tämän jälkeen tee luokkaan rakentaja, joka ottaa argumentteina kaksi merkkijonoa, rotu ja nimi. Oliota luotaessa edellisen luodun olion rotu tallenetaan luokkamuuttujaan edellinen. Luonnin yhteydessä maara-muuttuja kasvaa yhdellä.
Luokkaan tulee myös kolme metodia, tiedot, poista ja tilanne. Tiedot-metodi tulostaa "Olen [olion rotu] ja nimeni on [olion nimi]". Poista tulostaa "[olion nimi] poistettu!" ja vähentää luokkamuuttujaa maara yhdellä. Tilanne tulostaa "Eläimiä on tällä hetkellä [maara] kappaletta. Viimeisin rekisteröity eläin oli [viimeisimmän luodun olion rotu].".
Tämän jälkeen kopioi seuraava ohjelmakoodi lähdekoodiisi; koodilla kokeillaan luokkamäärittelyn toimintaa:
koira = Elain.new("koira","Rekku")
kissa = Elain.new("kissa","Raatelija")
lintu = Elain.new("kanarialintu","Tirppa")
koira.tiedot()
kissa.poista()
lintu.tilanne()
Toimiessaan oikein ohjelma tulostaa seuraavan tekstin ja tallentaa sen tiedostoon 9-4_tiedosto.txt
Example output:
Olen koira ja nimeni on Rekku!
Raatelija poistettu!
Eläimiä on tällä hetkellä 2 kappaletta.
Viimeisin rekisteröity eläin oli kanarialintu.
Vastaus
#!/usr/bin/env ruby
# coding: utf-8
$_tiedosto = "9-4_tiedosto.txt"
if (!File.exists?($_tiedosto))
begin
File.open($_tiedosto, File::RDWR|File::CREAT, 0644)
rescue
puts "Tiedostoon #{$_tiedosto} ei voida kirjoittaa"
Process.exit(1)
end
else
File.open($_tiedosto, "w+")
end
##########
class Elain
@@edellinen = ""
@@maara = 0
def initialize(rotu, nimi)
@nimi = nimi
@rotu = rotu
@@edellinen = rotu
@@maara += 1
end
def tiedot
lause = "Olen #{@rotu} ja nimeni on #{@nimi}!"
puts lause; File.open($_tiedosto, "a").write(lause + "\n")
end
def poista
lause = "#{@nimi} poistettu!"
@@maara -= 1
puts lause; File.open($_tiedosto, "a").write(lause + "\n")
# Ei välttämättä tarpeellinen...
ObjectSpace.define_finalizer(self, self.class.method(:finalize))
end
def tilanne
lause = "Eläimiä on tällä hetkellä #{@@maara} kappaletta.\nViimeisin rekisteröity eläin oli #{@@edellinen}."
puts lause; File.open($_tiedosto, "a").write(lause + "\n")
end
# Ei välttämättä tarpeellinen...
def self.finalize(object_id)
end
end
koira = Elain.new("koira","Rekku")
kissa = Elain.new("kissa","Raatelija")
lintu = Elain.new("kanarialintu","Tirppa")
koira.tiedot()
kissa.poista()
lintu.tilanne()