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

to odpowiedni kod. Co chcę zrobić, to zrobić metodę, pig!, która modyfikuje oryginalny ciąg. Jak to zrobić, bez modyfikowania siebie, bo to nie jest dozwolone ...?Modyfikuj własne, Ruby

Odpowiedz

3

Nie należy modyfikować siebie.

Użyj replace lub niestandardowej metody.

Przeczytaj "Writing method "change!" for String", aby uzyskać więcej informacji.

+2

Niezupełnie. W bibliotece są * tony * rzeczy. Na przykład "String # <<". To modyfikuje istniejący łańcuch i jest jedną z najczęściej używanych metod w całym programowaniu w języku Ruby (za takimi rzeczami jak 'puts' i' + '). – Linuxios

+1

Ta odpowiedź jest lepsza: http://stackoverflow.com/a/10391724/199712 –

4

Dla String można użyć self.replace do zmiany zawartości.

W przypadku innych klas nie sądzę, że może sam się zmodyfikować, chyba że utworzy nowy obiekt.

1

Nie ma nic złego w modyfikacji self, nie można jej przypisać, ale można użyć metod dostępowych do zmodyfikowania lub zmodyfikowania zmiennych instancji, jeśli masz do nich bezpośredni dostęp. String#replace jest akcesoriem w tym konkretnym przypadku.

Inny przykład:

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]! 

Jedną rzeczą do zapamiętania - zmienić wszystkie odniesienia do tego samego obiektu (b w moim przykładzie)!

13

Mam skondensowany kod trochę i dodaje metodę 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 
+1

'świnia!' Powinna po prostu być 'self.replace pig', aby uniknąć powtarzania typowych obliczeń. – dbenhur

+1

Podobała mi się ta odpowiedź lepiej niż odpowiedź wyjątkowa, ponieważ dostarczyłaś rozwiązanie. Chyba jestem leniwy - ale dlaczego zmuszasz nas do kliknięcia innego linku? – UncleAdam