2011-07-16 18 views
3

也許這是一個愚蠢的想法......我是Ruby的新手(和OOP,所以我仍然不知道我大部分時間都在做什麼),我想到了一個小而有趣的項目,我正在努力應對一些概念。試圖創建一個方法,從同一個類中選擇一個隨機方法

我在建的東西基本上是一個字符串操縱器。我正在用額外的方法構建一個模塊,然後在String類中包含它。

我的模塊有幾種方法以不同的方式操作字符串,主要是替換單詞,然後返回修改過的字符串。

爲了讓字符串操作更「自發」而自然,我想要做的是創建一個「main」方法(我將從字符串中調用的方法),隨機選擇一個字符串操作方法,然後返回字符串(然後可以再次調用一次應用多個操作)

我該怎麼做,或者類似的東西?希望我解釋自己

感謝

O.

回答

4

這裏的隨機操作模塊,像你描述它。 something_random主要方法:

module RandomStringManipulation 

    def something_random 
    methods = RandomStringManipulation.instance_methods 
    methods -= [:something_random] 
    send methods.sample # Ruby >= 1.9 required. See below for Ruby 1.8. 
    end 

    def foo 
    self + "foo" 
    end 

    def bar 
    self + "bar" 
    end 

end 

混合成String

class String 
    include RandomStringManipulation 
end 

現在,我們可以創建一個空字符串,然後做一些胡亂它幾次,打印出來的每個時間:

s = "" 
4.times do 
    s = s.something_random 
    p s 
end 

# => "foo" 
# => "foobar" 
# => "foobarbar" 
# => "foobarbarfoo" 

有兩點很有意思。第一是這樣的:

methods -= [:something_random] 

即從陣列methods去除:something_random,防止* something_random *方法從呼叫本身。第二個有趣的位是這樣的:

send methods.sample 

Array.sample(紅寶石> = 1.9)選擇一個隨機方法。然後send調度該方法。在Ruby 1.8中,請改爲:

send methods[rand(methods.size)] 
+0

感謝魯尼,這是非常有用的。你的答案對我來說非常有用,但我必須接受其中的一個,而馬克的更容易理解,但是你讓我學到了一些新東西。謝謝 –

+0

剛剛意識到,其他代碼沒有工作,我結束了不得不使用你的,所以我改變了接受的答案 –

+0

@ 0al0,我很高興它爲你工作。馬克裏德的答案中有一部分比我剛纔寫的更好:他警告你要警惕猴子補丁字符串。這是很好的建議。那裏有陷阱:想象一些寶石還有猴子修補字符串。當你的猴子補丁與別人衝突時,你會希望你從未出生。這可能是一個真正的痛苦。 –

4

如果所有將使用您的功能的代碼都是您的代碼,我將創建一個新類而不是猴子修補字符串。猴子補丁導致代碼難以理解和分享。

無論如何,鑑於突變方法的列表,你可以很容易地隨機挑選一個和使用對象#發送到調用它:

module StringMutator 
    def fold() ... end 
    def spindle() ... end 
    def mutilate() ... end 
end 

class NiftyString 
    include StringMutator 
    def random_change() 
    im = StringMutator.instance_methods 
    self.send im[rand im.length] 
    end 
end 
相關問題