修改自我,Ruby

时间:2012-04-30 20:21:29

标签: ruby

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

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

4 个答案:

答案 0 :(得分: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 :(得分:4)

你不应该修改自己。

使用replace或自定义方法。

阅读“Writing method "change!" for String”以获取更多信息。

答案 2 :(得分:4)

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

对于其他类,除非创建新对象,否则我认为它不能自行修改。

答案 3 :(得分: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)!