2013-02-13 72 views
2

我想在Ruby中爲String類添加自定義方法。據我所知,它可以用下面的代碼來完成:在模塊的上下文中添加方法到基類

class String 
    def my_own_method 
    # impelementation comes here 
    end 
end 

如果我寫在一個文件中的代碼說「string.rb」和其他地方,即在內部評級法,我寫require "string"那麼它工作得很好,我有權訪問任何字符串對象上的該自定義方法。 然而,問題出現時,我想我打包的自定義代碼到這樣的模塊:

module A 
    class String 
    def my_own_method 
     # implementation 
    end 
    end 
end 

然後,當我包括模塊(沒有錯誤),我沒有訪問每個方法除非我通過調用例如s = A::String.new直接實例化字符串。在這種情況下,我可以訪問我的自定義方法,但僅適用於不在任何字符串對象上的變量。我該怎麼做才能打包我的util類並自動將它們的方法添加到基類中?任何幫助真的很感激。

回答

5

一種選擇是使用::,以確保您獲取頂級String類:

module A 
    class ::String 
    def my_own_method 
     self.reverse 
    end 
    end 
end 

"some string".my_own_method # => "gnirts emos" 

我也有Sergio的在他回答的終點一致。不確定是否需要這樣做。

+0

非常感謝。它像一個魅力! – 2013-02-13 18:30:04

2

那麼,對於一件事,你可以使用class_eval

module A 
    String.class_eval do 
    def my_own_method 
     self.upcase 
    end 
    end 
end 


'foo'.my_own_method # => "FOO" 

但是,如果我是你,我會在全球範圍內(你的第一個片段)打開String類去。我真的不明白不這樣做的原因。

+0

謝謝,它的工作原理!但是從BaronVonBraun發佈的代碼中,我可以看到問題是範圍界定。 – 2013-02-13 18:29:43

相關問題