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

是相关的代码。我想要做的是制定一个方法,pig!,修改原始字符串。我该如何做,不修改自己,因为这是不允许的......?修改自己,红宝石

回答

3

你不应该修改自己。

使用replace或自定义方法。

阅读'Writing method "change!" for String'了解更多信息。

+2

不是真的。图书馆有*吨*的东西。以'String#<<'为例。这修改了现有的字符串,并且是所有Ruby编程中最常用的方法之一(在'puts'和'+'之类的后面)。 – Linuxios

+1

这个答案比较好:http://stackoverflow.com/a/10391724/199712 –

4

对于字符串,您可以使用self.replace来更改内容。

对于其他类,我不认为它可以修改自己,除非创建一个新的对象。

1

修改self没有什么错,你不能分配给它,但是如果你有直接的访问权限,你可以使用accessor方法修改它或者修改实例变量。 String#replace是这种特殊情况下的访问者。

又如:

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

有一点要记住 - 你改变(在我的例子b)同一对象的所有引用!

13

我已经凝聚你的代码一点点,并添加了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

'猪!'应该是'self.replace pig',以避免重复常见的计算。 – dbenhur

+1

因为您提供了一个解决方案,所以我比这个例外的答案更喜欢这个答案。猜猜我很懒 - 但为什么让我们点击另一个链接? – UncleAdam