Ruby Forum Italian Ruby user group > valore di un hash.. mi sono persa..

Posted by Njna Njna (njna)
on 23.07.2008 16:08
ciao a tutti..
ho questo codice:

def stampa_partenze(stazione)
  partenze={}
  for el in @nome_citta
    for i in 0...el[1].length-1
     if el[1][i]==stazione
       partenze[el[0]]=@nome_orari[el[0]][i]
     end
   end
  end
end

dove @nome_citta è un hash avete come chiave il nome di un treno e come
valore un elenco di città

@nome_citta[nome_treno]=lista_fermate

non riesco assolutamente a capire tutte quelle parentesi quadre di
stampa_partenze..

el[1][i]
cosa vuol dire?
e anche questo:
partenze[el[0]]=@nome_orari[el[0]][i]

potete spiegarmelo in parole povere?
Grazie mille a tutti!
Posted by Simone Scalabrino (intersimone999)
on 24.07.2008 00:03
Njna Njna wrote:
> ciao a tutti..
> ho questo codice:
> 
> def stampa_partenze(stazione)
>   partenze={}
>   for el in @nome_citta
>     for i in 0...el[1].length-1
>      if el[1][i]==stazione
>        partenze[el[0]]=@nome_orari[el[0]][i]
>      end
>    end
>   end
> end
> 
> dove @nome_citta è un hash avete come chiave il nome di un treno e come
> valore un elenco di città
> 
> @nome_citta[nome_treno]=lista_fermate
> 
> non riesco assolutamente a capire tutte quelle parentesi quadre di
> stampa_partenze..
> 
> el[1][i]
> cosa vuol dire?
> e anche questo:
> partenze[el[0]]=@nome_orari[el[0]][i]
> 
> potete spiegarmelo in parole povere?
> Grazie mille a tutti!

Per gestire gli hash ti conviene usare each:

hash.each do |chiave, valore|
  ...
end

Per gli array puoi sempre fare lo stesso:

array.each do |valore|
  ...
end

In questo modo dovrebbe essere tutto più semplice. Con il for nella 
variabile hai un array contenente chiave e valore ([chiave,valore]), più 
scomodo da decifrare.

Tradotto in linguaggio più semplice, dunque:
 def stampa_partenze(stazione)
   partenze={}
   @nome_citta.each do |nome, elenco|
     for i in 0...elenco.length-1
      if elenco[i]==stazione
        partenze[nome]=@nome_orari[nome][i]
      end
    end
   end
 end

Inoltre ti consiglierei un "return partenze" alla fine del metodo, sennò 
non avrebbe utilità.
Posted by Njna Njna (njna)
on 24.07.2008 09:16
Grazie ma non ho ancora capito il significato della quadre..

cosa vuol dire questo?
partenze[nome]=@nome_orari[nome][i]

Ancora grazie!

Simone Scalabrino wrote:
> 
> Per gestire gli hash ti conviene usare each:
> 
> hash.each do |chiave, valore|
>   ...
> end
> 
> Per gli array puoi sempre fare lo stesso:
> 
> array.each do |valore|
>   ...
> end
> 
> In questo modo dovrebbe essere tutto più semplice. Con il for nella 
> variabile hai un array contenente chiave e valore ([chiave,valore]), più 
> scomodo da decifrare.
> 
> Tradotto in linguaggio più semplice, dunque:
>  def stampa_partenze(stazione)
>    partenze={}
>    @nome_citta.each do |nome, elenco|
>      for i in 0...elenco.length-1
>       if elenco[i]==stazione
>         partenze[nome]=@nome_orari[nome][i]
>       end
>     end
>    end
>  end
> 
> Inoltre ti consiglierei un "return partenze" alla fine del metodo, sennò 
> non avrebbe utilità.
Posted by Simone Scalabrino (intersimone999)
on 24.07.2008 10:36
Njna Njna wrote:
> Grazie ma non ho ancora capito il significato della quadre..
> 
> cosa vuol dire questo?
> partenze[nome]=@nome_orari[nome][i]
> 
> Ancora grazie!
> 
> Simone Scalabrino wrote:
>> 
>> Per gestire gli hash ti conviene usare each:
>> 
>> hash.each do |chiave, valore|
>>   ...
>> end
>> 
>> Per gli array puoi sempre fare lo stesso:
>> 
>> array.each do |valore|
>>   ...
>> end
>> 
>> In questo modo dovrebbe essere tutto più semplice. Con il for nella 
>> variabile hai un array contenente chiave e valore ([chiave,valore]), più 
>> scomodo da decifrare.
>> 
>> Tradotto in linguaggio più semplice, dunque:
>>  def stampa_partenze(stazione)
>>    partenze={}
>>    @nome_citta.each do |nome, elenco|
>>      for i in 0...elenco.length-1
>>       if elenco[i]==stazione
>>         partenze[nome]=@nome_orari[nome][i]
>>       end
>>     end
>>    end
>>  end
>> 
>> Inoltre ti consiglierei un "return partenze" alla fine del metodo, sennò 
>> non avrebbe utilità.

Le quadre servono a richiamare un determinato elemento di un array o un 
hash. Ad esempio, in un hash fatto così:
"a"=>"ciao"
"b"=>"prova"
"c"=>"ruby"

se scrivi hash["a"] avrai come risultato "ciao" etc. Idem per gli array:
0=>"prova"
1=>"vero"
2=>"falso"
con array[1] avrai "vero".

Per quanto riguarda "@nome_orari", dev'essere una matrice, formata in 
questo modo:

0=>[]
1=>[]
2=>[]

Array di array praticamente. Richiamando l'elemento 0, non otterremo un 
numero o una stringa, ma un ulteriore array, da cui possiamo prendere 
l'elemento usando ancora le quadre. Ad esempio:

0=>["uno","due","tre"]
1=>["quattro","cinque","sei"]
2=>["sette","otto","nove"]

usando array[1] otterremo ["quattro","cinque","sei"]. Se a noi serve 
"cinque", possiamo prendere l'elemento "1" (ricorda, gli array partono 
da 0), quindi faremo:
array[1][1]