Due domande sugli array

Vi vorrei sottoporre due domande su due problemi che mi sono capitati
studiando Ruby.Nelle risposte considerate che sono all’inizio. 8>)

I domanda:
Questo e’ il codice che ho scritto

Creaziane dell array

a=%w{ pippo giovanni luca andrea }

Vedo quanti sono i componenti dell’array

n=a.size
#Inizio il ciclo per stamparli
for i in 0…n
puts “Il valore e’---------->” + a[i].to_s
end

I valori stamapti sono questi:
Il valore e’---------->pippo
Il valore e’---------->giovanni
Il valore e’---------->luca
Il valore e’---------->andrea
Il valore e’---------->
La domanda e’ perche compare l’ultima riga? Cioe’ il nil?

II Domanda:
Questo codice l’ho preso dal libro di M. Ceresa nel 3° capitolo.

a=%w{pera mela 1 Antonio casa_roma}
class Array
def conta_array
for x in self
puts x
end
end
end
a.conta_array

Ovviamente ,funziona!! Ma la mia domanda e’ perche usa “self”
Come fa la funzione a sapere quanti sono i componenti dell’array?
Grazie a tutti per le eventuali risposte!!

On 5/28/07, Giovanni C. [email protected] wrote:

n=a.size
Il valore e’---------->
La domanda e’ perche compare l’ultima riga? Cioe’ il nil?

Dovreasti mettere:

for i in 0…n

con 3 puntini…o piu semplicemente

a.each |item|
puts item
end

On 5/28/07, Giovanni C. [email protected] wrote:

n=a.size
Il valore e’---------->andrea
Il valore e’---------->
La domanda e’ perche compare l’ultima riga? Cioe’ il nil?

Perchè cerchi di stampare un elemento fuori dall’array…che è nil…e
nil.to_s è una stringa vuota…

a.each |item|
puts item
end

ho dimenticato un “do”…il codice giusto era:

a.each do |item|
puts item
end

in questo modo iteri l’array senza andare dopo l’ultimo elemento…

Grazie per le risposte, siete stati molto gentili.
Guardando bene il codice la prima domanda non l’avrei dovuta fare!! :slight_smile:
Grazie in particolare a Giovanni I. per l’esauriente spiegazione
sulla seconda domanda.
Per Andrea F.: In effetti il codice che tu hai scritto, l’autore lo
propone piu’ avanti per spiegare i BLOCCHI.

Il giorno 28/mag/07, alle ore 11:27, Giovanni C. ha scritto:

a=%w{ pippo giovanni luca andrea }

Questo crea un array a = [‘pippo’, ‘giovanni’, ‘luca’, ‘andrea’] di 4
elementi dove a[0] è il primo e a[3] l’ultimo. Ciò significa che…

for i in 0…n

Stai facendo un loop di una taglia più grande delle dimensioni
dell’array :). Dovresti fare 0…n-1 oppure 0…n (con tre punti) per
dirgli di loopare da 0 a n-1, cioè dimensioni dell’array.

La domanda e’ perche compare l’ultima riga? Cioe’ il nil?

Per il motivo sopra esposto :slight_smile:

Ovviamente ,funziona!! Ma la mia domanda e’ perche usa “self”
Questo codice è un pò più complesso, andiamo con ordine: l’inclusione
della definizione in class Array significa che stiamo “aprendo” la
classe Array, aggiungendo un metodo: conta_array. Questo metodo è
definito “instance method”, cioè metodo di istanza, ovvero un metodo
che è proprio della singola istanza di una classe. In ruby si è
soliti indicare questi metodi con #, es. Array#conta_array.

All’interno del metodo conta_array self si riferisce all’oggetto al
quale stai chiedendo di contarsi. L’espressione “for x in self”
significa “per ogni x elemento di me stesso”. In queto caso un array
sa di quanti elementi è composto e passa nel loop ogni elemento che
lo compone.

Entrambi questi programmi però non sono propriamente ruby-esqui. In
ruby il modo preferito di stampare il contenuto di un array è

a = %w(quanto e bello ruby)
a.each {|element| puts element}

che tra l’altro ha il vantaggio di essere più corto :slight_smile: