Forum: Italian Ruby user group array con indici a partire da uno

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Matteo T. (Guest)
on 2009-03-15 16:24
buongiorno,

vedendo la possibilità in ruby di riaprire classi e modificare in
real-time la core del linguaggio ho voluto provare una cosa semplice
come far partire gli array da 1 fino a n, e non 0, n - 1

Io ho provato così:

class Array
  def [](i)
    return self[i - 1]
  end
   def []=(i, v)
    self[i - 1] = v
  end
end

e poi uso

l = Array.new(2)
l[1] = 1
l[2] = 2
puts l[1], l[2]

ma così mi da un errore del tipo "stack level too deep"

grazie
Luca G. (Guest)
on 2009-03-15 16:52
(Received via mailing list)
Matteo T. wrote:
> ma così mi da un errore del tipo "stack level too deep"
Perché invochi i metodi [] e []= dentro la loro definizione, quindi
effettuano una ricorsione infinita. Prova con:

class Array
   def [](i)
     at(i + 1)
   end

   def []=(i, v)
     insert(i + 1, v)
   end
end

Luca
Matteo T. (Guest)
on 2009-03-15 17:07
Luca G. wrote:
> Matteo T. wrote:
>> ma cos� mi da un errore del tipo "stack level too deep"
> Perch� invochi i metodi [] e []= dentro la loro definizione, quindi
> effettuano una ricorsione infinita. Prova con:
>
> class Array
>    def [](i)
>      at(i + 1)
>    end
>
>    def []=(i, v)
>      insert(i + 1, v)
>    end
> end
>
> Luca

grazie ora funziona.
pensavo che usando dentro la ridefinizione gli operatori richiamasse la
vecchia versione.
Sandro P. (Guest)
on 2009-03-15 17:27
(Received via mailing list)
se vuoi chiamare la vecchia definizione dalla nuova usa super :D

2009/3/15 Matteo T. <removed_email_address@domain.invalid>
This topic is locked and can not be replied to.