Ruby: Hjälp med att lägga till element i en Array. Och problem med att anropa metode.

Permalänk
Medlem

Ruby: Hjälp med att lägga till element i en Array. Och problem med att anropa metode.

Hejsan.
Jag har nu slitit hår i 5-6 dagar för att få ut denna futtiga mängden kod, jag har helt och hållet tokfastnat vad gäller arrayer. Jag har lärt mig nu vad en array är, och vad den inte är. Jag vet att den fungerar som en pekare, men innan trodde jag att den fungerade som en databas.
Alltså att du bokstavligen talat lagrade datan i arrayen.

Saken är den att i mitt problem så är det följande.
Jag har läst tusentals guider om arrayer, men INGEN guide visar hur man slänger in element i den, hur man helt enkelt ökar på antalet index och så att arrayen pekar mot rätt objekt. Jag förstår inte hur svårt det kan vara att vara så tydlig som möjligt, jag ber er, hur ska jag gå tillväga.

Någon som kan ge lite tips på hur jag ska fixa om denna koden så att jag kan anropa inChecknings metoden samt att datan jag skriver in pekas rätt i arrayen?

Jag vet att du anropar metoder genom

def metod puts 'Hej' end metod

Men varför kan jag inte anropa min metod när jag gör exakt likadant i kodrutan här under?

class KundData class Kund attr_accessor :forNamn attr_accessor :efterNamn attr_accessor :adress attr_accessor :telefonnummer def initialize (forNamn, efterNamn, adress, telefonnummer) @forNamn = forNamn @efterNamn = efterNamn @adress = adress @telefonnummer = telefonnummer end def inCheckning puts "Ange förnamn" forNamn = gets.chomp puts "Ange efternamn" efterNamn = gets.chomp puts "Ange adress" adress = gets.chomp puts "Ange telefonnummer" telefonnummer = gets.chomp kund = Kund.new(forNamn,efterNamn,adress,telefonnummer) Kunder[Kunder.length] = kund end Kunder = Array.new(32) inCheckning end end

ALL hjälp uppskattas.

Notera, jag är INTE ute efter färdiga lösningar, bara små rader som kan hjälpa mig i rätt riktning. Detta pågrund av att jag ej vill åka dit för fusk och för att jag innerst inne vill lära mig detta.

Tack på förhand!

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem

Läs dokumentationen för Array, speciellt om operatorerna << och []=. Jag tror dessutom att du har problem med scope på variabeln "Kunder" — den syns nog inte inne i funktionen "inCheckning". Får du några felmeddelanden från tolken?

det var tydligen Ruby
Permalänk
Medlem

Jag har läst deras API, men jag förstår inte.
Jag vet inte vart i dokumentet jag ska placera Kunder = Array.new(32).

Felmeddelandet är
kund_data.rb:37: undefined local variable or method `inCheckning' for KundData::Kund:Class (NameError)

Jag vet ju vad det innebär, men jag förstår inte hur jag inte kan anropa metoden när jag kunde göra det i den tidigare anropa-metoden exemplet.
Där var det ju END först, och sen METODNAMNET. Samma sak i mitt program :/

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem

Du kan inte anropa en metod hur som helst inifrån en klass. Du måste göra detta i en annan metod i klassen, eller utanför klassen (eller i detta fallet, klasserna); och i det senare fallet måste du antingen anropa metoden statiskt eller instansiera klassen innan du anropar dess metod. Exempel:

class Bil attr_accessor: bil_marke def initialize(marke) @bil_marke = marke end def starta # Lite logik här? end end minbil = Bil.new("SAAB") minbil.starta

Permalänk
Medlem

Då hoppar jag lite framåt i förståelse iallafall.

Men nu försöker jag göra såhär.

def inCheckning puts "Ange förnamn" forNamn = gets.chomp puts "Ange efternamn" efterNamn = gets.chomp puts "Ange adress" adress = gets.chomp puts "Ange telefonnummer" telefonnummer = gets.chomp kund = Kund.new(forNamn,efterNamn,adress,telefonnummer) Kunder[Kunder.length] = kund end end end KundData.inCheckning

jag försöker alltså utanför klasserna anropa metoden. Men här får jag också fel.
Vad är det jag missuppfattar som gör att jag ständigt gör om samma fel?

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem

Vad får du för fel nu då? Testa att byta ut Kunder[Kunder.length] = kund mot Kunder << kund.

Permalänk
Medlem

Den säger fortfarande att inCheckning är odefinerad, verkar som att den inte har någon som helst kontakt med inCheckning-metoden.
Ska det inte räcka att skriva som jag gör för att anropa en metod?

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem

Metoden du har är inte en statisk metod, alltså måste du (som jag visade ovan) instansiera klassen först, dvs. skapa ett objekt:

kd = KundData.new kd.inCheckning

Permalänk
Medlem

Vart ska den placeras ungefär? För sätter jag den inom metoden så händer ingenting och sätter jag den utanför så får jag ungefär samma felmeddelande.

kund_data.rb:44: undefined method `inCheckning' for #<KundData:0x28a5ec0> (NoMethodError)

Tack så jättemycket för hjälpen hittils

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem

Ett tips: nar du borjar gora trial-and-error sa ar det ett tecken pa att du inte forstar det du haller pa med. Lagg lite tid pa att lasa och forsta konceptet. I detta fallet bor du lasa mer om klasser, objekt och statisk/dynamisk allokering.

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Medlem

Tack. Det var något sådant svar jag var ute efter Jag ska läsa igenom detta!
Tack också "You" för all kod!

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem

NP, googla aven pa 'objekt orientering' och vad 'instansiering' innebar. Kortfattat: ett objekt ar en instans av en klass. Lycka till!

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Medlem

class inCheckning

def inCheckning

puts "Ange förnamn"
forNamn = gets.chomp

puts "Ange efternamn"
efterNamn = gets.chomp

puts "Ange adress"
adress = gets.chomp

puts "Ange telefonnummer"
telefonnummer = gets.chomp

kund = Kund.new(forNamn,efterNamn,adress,telefonnummer)
Kunder[Kunder.length] = kund
end
end
end
KundData.inCheckning

Visa signatur

Im just newbie

Permalänk
Medlem

class KundData

@kunder= []

def inCheckning

puts "Ange förnamn"
forNamn = gets.chomp

puts "Ange efternamn"
efterNamn = gets.chomp

puts "Ange adress"
adress = gets.chomp

puts "Ange telefonnummer"
telefonnummer = gets.chomp

# För att lägga till i slutet av en array använd push
@kunder.push(Kund.new(forNamn,efterNamn,adress,telefonnummer))

end

end

kunddata = KundData.new
kunddata.inCheckning

# ser koden ut för själva incheckningen.
#Sedan för att hämta ut.

kunddata.kunder.each{|kund|
puts "Förnamn: #{kund.forNamn}"
puts "Efternamn: #{kund.efterNamn}"
puts "Adress: #{kund.adress}"
puts "Telefonnummer: #{kund.telefonnummer}"
}

# Den här koden skulle du kunna copy-paste in i ett ruby script

Visa signatur

Im just newbie