是否有可能在最后使用爆炸来修补方法?
我想要修补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"
答案 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