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

是相关代码。我想做的是制作一个pig!修改原始字符串的方法。我该怎么做,而不修改自我,因为那是不允许的......?

4

4 回答 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
于 2012-04-30T23:10:26.077 回答
4

你不应该修改 self.

使用replace或自定义方法。

阅读'写作方法“改变!” 对于 String ' 了解更多信息。

于 2012-04-30T20:30:53.657 回答
4

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

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

于 2012-04-30T20:32:56.570 回答
2

修改没有错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在我的例子中)!

于 2012-04-30T21:25:33.673 回答