Errore su Set

Intanto vorrei ringraziare tutti coloro che sn sempre disposti ad
aiutare persone come me ai primi approcci con ruby…

Il mio problema attuale è il seguente:
ho due piani di studio: @piano_di_studi e p
Ho il seguente metodo che calcola i crediti comuni tra i due piani,
ovvero per gli esami in comune tra p e @piani_di_studio, si va a
incrementare crediti_comuni con i crediti di quell’esami pescati
dall’hash @@crediti

def crediti_comuni§
crediti_comuni = 0
for j in p
for i in @piano_di_studi #per ogni esame nel piano
if (i.eql?(j))
crediti_comuni += @@crediti[i]
end
end
return crediti_comuni
end
end

l’errore che mi viene dato è il seguente

“189:in crediti_comuni': undefined methodeach’ for
#<PianoDiStudi:0xa3d3b @piano_di_studi=#<Set: {}>> (NoMethodError)”

dove la riga 189 è la seguente -> for j in p

per quel poco di esperienza che ho pare che non riesca a scorrere p…
perchè se scorre @piano_di_studi non scorre p?

(ruby e il caldo non fanno una bella coppia… sigh… )

grazie a tutti…

On Jun 24, 2008, at 3:49 PM, Njna N. wrote:

def crediti_comuni§

(ruby e il caldo non fanno una bella coppia… sigh… )
Sara’ mica che non hai definito il metodo “each” nella tua classe
“PianoDiStudi”?

S.

Scusa ma cosa intendi per metodo each?

so che il for usa l’each ma non ho mai definito un metodo per gestire la
cosa…

cosa dovrei fare quindi?

grazie

Stefano C. wrote:

On Jun 24, 2008, at 3:49 PM, Njna N. wrote:

def crediti_comuni§

(ruby e il caldo non fanno una bella coppia… sigh… )
Sara’ mica che non hai definito il metodo “each” nella tua classe
“PianoDiStudi”?

S.

Njna N. wrote:

Scusa ma cosa intendi per metodo each?

so che il for usa l’each ma non ho mai definito un metodo per gestire la
cosa…

cosa dovrei fare quindi?

Dall’errore, sembra che @piano_di_studi sia un oggetto di tipo
PianoDiStudi, che non e’ un Enumerable.

Quello su cui tu vuoi iterare sembra invece essere il set
piano_di_studi, attributo dell’oggetto @piano_di_studi.
Quindi, se l’hai reso pubblico, @piano_di_studi.piano_di_studi.

Njna N. wrote:

Il mio problema attuale è il seguente:
ho due piani di studio: @piano_di_studi e p
Ho il seguente metodo che calcola i crediti comuni tra i due piani,
ovvero per gli esami in comune tra p e @piani_di_studio, si va a
incrementare crediti_comuni con i crediti di quell’esami pescati
dall’hash @@crediti

def crediti_comuni§
crediti_comuni = 0
for j in p
for i in @piano_di_studi #per ogni esame nel piano
if (i.eql?(j))
crediti_comuni += @@crediti[i]
end
end
return crediti_comuni
end
end

Ma non conviene lavorare sull’intersezione dei due piani di studi (visto
che almeno uno di loro e’ un Set)?

def crediti_comuni§
(p & @piano_di_studi.piano_di_studi).inject(0) do |sum, x|
sum += @@crediti[x]
end
end

Correzione:

sum += @@crediti[x]

sum + @@crediti[x]

Njna N. wrote:

Io ho una classe PianoDiStudi

con

def initialize
@piano_di_studi = Set.new([])
end

Vedi? @piano_di_studi e’ il Set, ed e’ un attributo della classe
PianoDiStudi.

nel main io vado a fare questo

p1 = PianoDiStudi.new()
p2 = PianoDiStudi.new()

Quindi il set su cui iterare non e’ p1, ma p1.piano_di_studi
(se hai reso pubblico l’attributo)

Io ho una classe PianoDiStudi

con

def initialize
@piano_di_studi = Set.new([])
end

nel main io vado a fare questo

p1 = PianoDiStudi.new()
p2 = PianoDiStudi.new()

metto degli esami dentro a p1 etc…

ad un certo punto nel main faccio questo

puts p1.crediti_comuni(p2) che richiama il metodo di cui parlavamo…

come nel resto dell’esercizio ho scorso p1 nn mi pareva così difficile
scorrere p2!

Claudio Petasecca D. wrote:

Dall’errore, sembra che @piano_di_studi sia un oggetto di tipo
PianoDiStudi, che non e’ un Enumerable.

Quello su cui tu vuoi iterare sembra invece essere il set
piano_di_studi, attributo dell’oggetto @piano_di_studi.
Quindi, se l’hai reso pubblico, @piano_di_studi.piano_di_studi.

Funziona!!!
Vi ringrazio tantissimo… tutti santi! :smiley:

Njna N. wrote:

scusa ma nn credo di aver capito cosa devo modificare quindi…

class PianoDiStudi
attr_reader :piano_di_studi # per esportare il set di esami

def crediti_comuni§
(p.piano_di_studi & @piano_di_studi).inject(0) do |sum, x|
sum + @@crediti[x]
end
end

end

scusa ma nn credo di aver capito cosa devo modificare quindi…