Vik*_*nic 0 ruby monkeypatching
是否有可能在最后使用爆炸来修补方法?
我想要猴子补丁String.upcase!,但我不知道如何实现.
问题是我想要更改原始字符串对象.
这是一个例子:
class String
def upcase!
self.mb_chars.upcase.to_s
end
end
Run Code Online (Sandbox Code Playgroud)
现在,如果我在控制台中输入并尝试它,它不起作用:
[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"
Run Code Online (Sandbox Code Playgroud)
你应该避免猴子修补顶级课程String.如果您想知道原因,我强烈建议您阅读Monkeypatching是由Avdi Grimm销毁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"
Run Code Online (Sandbox Code Playgroud)