0

是否可以在最后用一声巨响对方法进行猴子修补?

我想猴子补丁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

4 回答 4

6

您应该避免猴子修补顶级类,例如String. 如果您想知道原因,我强烈建议您阅读Avdi Grimm 的 Monkeypatching is Destroying Ruby

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

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"
于 2013-10-14T15:48:24.217 回答
2

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

class String
  def foo
    replace(whatever_string_you_want_to_replace_the_receiver_with)
  end
end

您也许可以将mb_chars.upcase其作为论据replace

于 2013-10-14T15:42:27.227 回答
1

bang 只是方法名称的一部分。它绝对没有任何特殊含义。您编写一个结尾带有 bang 的方法,与编写结尾带有 'o' 或 'z' 的方法完全相同。

于 2013-10-14T23:03:31.507 回答
0

怎么样:

class String
  def upcase!
     #Your logic here
  end
end
于 2013-10-14T15:32:15.067 回答