2013-05-23 5 views
5

Parte del mio codice è il seguente:Come quadrare ogni elemento di un array nella classe Array in Ruby?

class Array 
    def square! 
    self.map {|num| num ** 2} 
    self 
    end 
end 

Quando chiamo:

[1,2,3].square! 

mi aspetto di ottenere [1,4,9], ma invece ho [1,2,3 ]. Perché è così? Quando chiamo:

[1,2,3].map {|num| num ** 2} 

al di fuori del metodo di classe, ottengo la risposta corretta.

+0

Qual è il motivo (prestazioni?) Per distruggere l'array originale (dichiarazione/imperativo) invece di restituire una nuova (espressione/funzionale)? – tokland

+0

Si usa 'map' per creare una serie di quadrati, e poi basta buttarlo via e ritornare' self'. – RocketR

risposta

9

È necessario utilizzare Array#map!, non Array#map.

Array#map ->richiama il blocco specificato una volta per ogni elemento di self.Creates un nuovo vettore contenente i valori restituiti dal blocco.

Array#map! ->Invoca il blocco dato una volta per ciascun elemento di sé, sostituendo l'elemento con il valore restituito dal blocco.

class Array 
    def square! 
    self.map! {|num| num ** 2} 
    end 
end 

[1,2,3].square! #=> [1, 4, 9] 
+0

Ah, perfetto. Grazie! – mrdziuban

+2

E puoi tralasciare la linea 'self'. 'Self.map! {..} 'restituisce già la matrice – ovhaag