2012-04-30 10 views
6
module Pigged 
    String.class_eval do 
    def pig 
     newstring = self + self[0]; newstring[0] = ""; newstring += "ay" 
     return newstring 
    end 
    end 
end 

è il codice pertinente. Quello che voglio fare è creare un metodo, pig!, che modifichi la stringa originale. Come posso farlo senza modificare me stesso, perché non è permesso ...?Modifica Self, Ruby

risposta

3

Non modificare se stessi.

Utilizzare replace o un metodo personalizzato.

Leggere "Writing method "change!" for String" per ulteriori informazioni.

+2

davvero. Ci sono * tonnellate * di cose nella libreria che fanno. Prendi 'String # <<', per esempio. Questo modifica la stringa esistente ed è uno dei metodi più usati in tutta la programmazione di Ruby (dietro cose come 'puts' e' + '). – Linuxios

+1

Questa risposta è migliore: http://stackoverflow.com/a/10391724/199712 –

4

Per String, è possibile utilizzare self.replace per modificare il contenuto.

Per le altre classi, non penso che possa modificare se stesso a meno di creare un nuovo oggetto.

1

Non c'è nulla di sbagliato nella modifica di self, non è possibile assegnargliele, ma è possibile utilizzare metodi accessor per modificarlo o modificare variabili di istanza se si ha accesso diretto ad esse. String#replace è un accessorio in questo caso particolare.

Un altro esempio:

class Array 
    def delete_first_element! 
    self[0..0] = [] 
    end 
end 

a = [1,2,3] 
b = a 

a.delete_first_element! 

puts a.inspect # [2,3] 
puts b.inspect # [2,3]! 

Una cosa da ricordare - si cambia tutti i riferimenti dello stesso oggetto (b nel mio esempio)!

13

ho condensato il codice un po 'e ha aggiunto il metodo pig!:

module Pigged 
    String.class_eval do 
    def pig 
     self[1..-1] + self[0] + 'ay' 
    end 
    def pig! 
     self.replace(pig) #self.replace(self[1..-1] + self[0] + 'ay') 
    end 
    end 
end 
Non
+1

'pig!' Dovrebbe essere semplicemente 'self.replace pig' per evitare di ripetere il calcolo comune. – dbenhur

+1

Mi è piaciuta questa risposta meglio della risposta esclusa perché hai fornito una soluzione. Suppongo di essere pigro, ma perché ci fanno fare clic su un altro link? – UncleAdam