修改Self,Ruby

6
module Pigged
  String.class_eval do
    def pig
      newstring = self + self[0]; newstring[0] = ""; newstring += "ay"
      return newstring
    end
  end
end

这是相关的代码。我想做的是创建一个方法pig!,来修改原始字符串。但是如何在不修改self的情况下实现呢?因为这是不允许的...

4个回答

15

我稍微简化了你的代码,并添加了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

4

3
不完全是。图书馆里有很多东西可以做到。例如,以String#<<为例。它修改现有的字符串,是Ruby编程中最常用的方法之一(仅次于puts+等)。 - Linuxios

4

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

对于其他类,除非创建一个新对象,否则我认为它无法修改自身。


3

修改self并没有错,虽然你不能对其进行赋值,但是你可以使用访问器方法来进行修改,或者如果你有直接访问实例变量的权限,那么也可以修改它们。在这种情况下,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)的引用!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接