Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 28 Nov 2016, 16:41 
Offline
Nuby

Registriert: 28 Nov 2016, 16:15
Beiträge: 2
Guten Tag,
ich komme frisch von Java und möchte in Ruby ein bisschen programmieren. Mein derzeitiges Ziel ist es eine Model-Klasse zu programmieren in der ein Array verwaltet wird welches Objekte einer bestimmten Klasse enthält. Mein Problem ist jetzt das die Objekte in dem Array keine Methoden der Klasse enthalten und ich verstehe nicht warum.

Hier die Klasse um die es geht:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

class Paket_Modul
#Import von Klassen
require_relative 'paket_obj'

attr_reader :array_of_packages

def initialize
@array_of_packages = Array.new
@array_of_packages << add_new_Paket
@array_of_packages.delete_at(0)
end


def add_new_Paket
#Paket wird mit einer ID initalisiert
newpaket = Paket_Obj.new(@array_of_packages.last == nil ? 0 : @array_of_packages.last.id_paket+1)
#Objekt von Typ Paket_Obj dem Array hinzuf��gen
@array_of_packages << newpaket
end

def defineinformation_Paket(param,constantoption)
@array_of_packages[param].AddConstant(constantoption)
end

#Warum erkennt er nciht das es die Methode id_paket gibt? aber er wei�� das es von Klasse paket_Obj ist
a = Paket_Modul.new
a.add_new_Paket
# a.add_new_Paket
for param in a.array_of_packages
print "Item in Array " + "\n"
print param
print "\n"
end



end


Hier der Fehler
C:/Users/Alaska/RubymineProjects/ruby_learningrepo/MasterPackages/PaketModul/paket_modul.rb:16:in `add_new_Paket': undefined method `id_paket' for [[...]]:Array (NoMethodError)
from C:/Users/Alaska/RubymineProjects/ruby_learningrepo/MasterPackages/PaketModul/paket_modul.rb:27:in `<class:Paket_Modul>'
from C:/Users/Alaska/RubymineProjects/ruby_learningrepo/MasterPackages/PaketModul/paket_modul.rb:1:in `<top (required)>'
from -e:1:in `load'
from -e:1:in `<main>'

und hier die Objektklasse:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

class Paket_Obj
#@@array = Array.new
attr_accessor :mobilnumber, :emailadresse, :name_ofcertPerson, :id_paket, :id_vorgang, :firma

def self.all_instances
@@array
end

def initialize(id_paket, attributes = {})
@mobilnumber = attributes[:mobilnumber]
@name_ofcertPerson = attributes[:name_ofcertPerson]
@emailadresse = attributes[:emailadresse]
@firma = attributes[:firmav]
@id_paket = id_paket
@id_vorgang = attributes[:id_vorgang]
end

def AddConstant(param)
puts case param
when 0
@mobilnumber = '0152240257825'
@name_ofcertPerson = 'Emil Klaus'
@emailadresse= 'email@info.de'
@firma = 'AGEWES'
@id_vorgang = 0
when 1
@mobilnumber = '015758625623'
@name_ofcertPerson = 'Dirk Heisenberg'
@emailadresse= 'MAIL@info.de'
@firma = 'AERTGD'
@id_vorgang = 1
end
end
end


Ich muss einen elementaren Fehler bei der Verwaltung bzw. Erstellung von Objekten von Klassen machen nur weiß ich nicht welcher.
Vielen Dank für eure Hilfe. (Dieser Post wurde etwas schnell erstellt)


Nach oben
 Profil  
 
BeitragVerfasst: 29 Nov 2016, 11:47 
Offline
Metaprogrammierer

Registriert: 20 Nov 2011, 21:51
Beiträge: 693
Ich habe den Code jetzt nur überflogen, aber ich befürchte, dass der Fehler irgendwie damit zu tun hast, dass du in add_new_paket etwas in @array_of_packages hineintust und direkt zurückgibst, diesen Rückgabewert hängst du dann an @array_of_packages an.

Ob das aber wirklich den gezeigten Fehler verursacht kann ich gerade nicht beurteilen, dennoch würde ich an Deiner Stelle damit beginnen in Zeile 10 einfach nur add_new_paket aufzurufen.

_________________
Ubuntu Gnome 14.04 LTS
rvm mit App-spezifischer Ruby-Version (meist 2.2.x) und -Gemset

Github ProfilBitbucket Profil


Nach oben
 Profil  
 
BeitragVerfasst: 29 Nov 2016, 12:28 
Offline
Lehrling
Benutzeravatar

Registriert: 28 Feb 2012, 21:58
Beiträge: 86
Wohnort: NRW
Ich habe das ganze mal etwas gefixt und denke mal das du es ungefähr so haben wolltest.
Ich habe auch mal ein paar Syntax sachen angepasst wie es in Ruby üblicher ist :) methoden != FooBar sondern foo_bar

pack_module.rb


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
require_relative 'pack_obj'

class PaketModul

attr_reader :array_of_packages

def initialize
@array_of_packages = Array.new
end

def add_new_paket
newpaket = PaketObj.new(@array_of_packages.last == nil ? 0 : (@array_of_packages.last.id_paket) + 1)
@array_of_packages << newpaket
end

def define_information_Paket(param,constantoption)
@array_of_packages[param].add_constant(constantoption)
end

end

a = PaketModul.new
a.add_new_paket
a.add_new_paket
puts a.array_of_packages.length
a.array_of_packages.each { |i| puts i.id_paket }

#Output ist =>
# 2 <- ist die Item l��nge von @array_of_packages -- also es sind 2 drin weil ich dort 2 mal add_new_paket ausgef��hrt habe
# 0 <- das erste objekt im array hat den id_paket wert 0
# 1 <- das zweite objekt im array hat den id_paket wert 1



pack_obj.rb


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class PaketObj

attr_accessor :mobilnumber, :emailadresse, :name_ofcertPerson, :id_paket, :id_vorgang, :firma

def self.all_instances
@@array
end

def initialize(id_paket, attributes = {})
@mobilnumber = attributes[:mobilnumber]
@name_ofcertPerson = attributes[:name_ofcertPerson]
@emailadresse = attributes[:emailadresse]
@firma = attributes[:firmav]
@id_paket = id_paket
@id_vorgang = attributes[:id_vorgang]
end

def add_constant(param)
puts case param
when 0
@mobilnumber = '0152240257825'
@name_ofcertPerson = 'Emil Klaus'
@emailadresse= 'email@info.de'
@firma = 'AGEWES'
@id_vorgang = 0
when 1
@mobilnumber = '015758625623'
@name_ofcertPerson = 'Dirk Heisenberg'
@emailadresse= 'MAIL@info.de'
@firma = 'AERTGD'
@id_vorgang = 1
end
end
end


Zusammengefasst kann man sagen das dein Objekt klasse ich nicht verwendet habe und auch nichts geändert habe.
Ganz im gegeteil zu der Modul klasse dort habe ich denn init bereich auf das Festlegen eines Array beschränkt weil vorher hast du es mit dem Init überschrieben und hat nur fehler verursacht.

Daher bitte ich dich mal die Quelltexte zu vergleichen und ob ich deinen Code so weit gefixt habe und wenn rückfragen sind kannst du sie gerne stellen VG Manchotix


Nach oben
 Profil  
 
BeitragVerfasst: 30 Nov 2016, 10:15 
Offline
Schüler

Registriert: 06 Mai 2008, 12:42
Beiträge: 22
Wohnort: München
Du hast in Deinem initialize die Anweisung

@array_of_packages << add_new_Paket

und in der Methode add_new_paket hast Du die Anweisung

@array_of_packages << newpaket

und gibst @array_of_packages als Ergebnis der Methode zurück.

Du schiebst also erst die Referenz auf newpaket in @array_of_packages rein, und anschließend schiebst Du die Referenz auf @array_of_packages selbst in @array_of_packages rein (zirkuläre Referenz). Dass da der Ruby-Compiler traurig wird, kann man schon verstehen :mrgreen: .


Nach oben
 Profil  
 
BeitragVerfasst: 30 Nov 2016, 16:07 
Offline
Nuby

Registriert: 28 Nov 2016, 16:15
Beiträge: 2
Oh mann das ist mir gar nicht aufgefallen. :o Vielen Dank für eure Hilfe


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron