2013-10-14 59 views
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" 
+2

对于没有爆炸声的方法来说,这并没有什么不同 –

+2

警告:如果这是你的意图,那么你的责任是让你的方法修改调用者。但是,这是没有什么不同的是,当你在没有爆炸的情况下使用相同的方法修补时,你不必修改调用者。 –

回答

2

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

class String 
    def foo 
    replace(whatever_string_you_want_to_replace_the_receiver_with) 
    end 
end 

你可以或许把mb_chars.upcase作为参数传递给replace

+0

谢谢,伙计!那样做了! –

0

如何:

class String 
    def upcase! 
    #Your logic here 
    end 
end 
+0

我需要替换原始字符串。我知道我可以写你写的东西,但你能告诉我一些将取代原始字符串的例子吗? –

+0

对不起,我真的不明白你想要处理的问题。请更新有关更多详细信息的问题。 –

+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

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