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

ilgili koddur. Yapmak istediğim, orijinal dizeyi değiştiren bir yöntem, pig! yapmaktır. Kendimi değiştirmeksizin bunu nasıl yapabilirim, çünkü buna izin verilmez ...?Kendiliğinden Değiştir, ilgili kod Ruby

cevap

3

Kendinizi değiştirmemelisiniz.

replace veya özel bir yöntem kullanın.

Daha fazla bilgi için 'Writing method "change!" for String' bölümünü okuyun.

+2

değil. Kütüphanede * ton * şeyler var. Örneğin, String # << 'yi al. Bu, varolan dizeyi değiştirir ve tüm Ruby programlamasında en çok kullanılan yöntemlerden biridir ("koyar" ve "+" gibi). – Linuxios

+1

Bu cevap daha iyidir: http://stackoverflow.com/a/10391724/199712 –

4

Dize için, içeriği değiştirmek için self.replace özelliğini kullanabilirsiniz.

Diğer sınıflar için, yeni bir nesne oluşturmadıkça kendini değiştirebileceğini düşünmüyorum.

1

self'u değiştirmeyle ilgili bir sorun yok, buna atayamazsınız, ancak bunlara erişmek için erişim yöntemlerini kullanabilir veya bunlara doğrudan erişiyorsanız örnek değişkenleri değiştirebilirsiniz. Bu özel durumda String#replace bir erişimcisidir.

Başka bir örnek:

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

Bir şey hatırlamak - Sen (bizim örneğimizde b) aynı nesnenin tüm başvuruları değiştirin!

13

Ben kodunuzu biraz yoğunlaşmış ve pig! yöntemi ekledik: gerçekten

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

'pig!' Sadece ortak hesaplamayı tekrarlamaktan kaçınmak için 'self.replace' olmalıdır. – dbenhur

+1

Bu cevabı, bir çözüm sağladığınız için istisnai bir yanıttan daha çok beğendim. Sanırım tembelim - ama neden başka bir bağlantıyı tıklatıyorsun? – UncleAdam

İlgili konular