猴子修补红宝石方法与爆炸

时间:2013-10-14 15:29:10

标签: ruby monkeypatching

是否有可能在最后使用爆炸来修补方法?

我想要修补String.upcase!,但我不知道如何实现这一目标。

问题是我想要更改原始字符串对象。

以下是一个例子:

class String
  def upcase!
    self.mb_chars.upcase.to_s
  end
end

现在如果我在控制台中输入并试用它,它就不起作用了:

[1] pry(main)> asd="asd"
=> "asd"
[2] pry(main)> asd.upcase
=> "ASD"
[3] pry(main)> asd
=> "asd"
[4] pry(main)> asd.upcase!
=> "ASD"
[5] pry(main)> asd
=> "asd"

4 个答案:

答案 0 :(得分:6)

你应该避免猴子修补像String这样的顶级课程。如果您想知道原因,我强烈建议您阅读Monkeypatching is Destroying Ruby by Avdi Grimm

现在回答你的问题,你可以这样做:

class String
  def upcase!
    replace(upcase) # self is not mandatory here
  end
end

> s = "foo"
 => "foo"
> s.upcase
 => "FOO"
> s
 => "foo"
> s.upcase!
 => "FOO"
> s
 => "FOO"

答案 1 :(得分:2)

您的问题与爆炸的方法无关。如果要替换接收器字符串,请使用方法String#replace

class String
  def foo
    replace(whatever_string_you_want_to_replace_the_receiver_with)
  end
end

您可以将mb_chars.upcase作为replace的参数。

答案 2 :(得分:1)

爆炸只是方法名称的一部分。它绝对没有任何特殊意义。你在最后编写了一个方法,就像你在最后编写一个带有'o'或'z'的方法一样。

答案 3 :(得分:0)

怎么样:

class String
  def upcase!
     #Your logic here
  end
end