2012-10-07 80 views
0

我創建了以下擴展打開一個參數爲接收器

class String 
    def is_a_number? s # check if string is either an INT or a FLOAT (12, 12.2, 12.23 would return true) 
    s.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true 
    end 
end 

我怎樣才能使它作爲一個鏈接的方法工作?

is_a_number?("10") # returns true 
"10".is_a_number? # returns an error (missing arguments) 

更新

感謝澤,mikej和拉蒙對他們的答案。至於建議,我改變了類對象,並擺脫了參數(或多個):

class Object 
    def is_a_number? # check if string is either an INT or a FLOAT (12, 12.2, 12.23 would return true) 
    to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) != nil 
    end 
end 

現在工作完全正常:

23.23.is_a_number? # > true 

感謝球員...

回答

2

當你寫"10".is_a_number?,你已經有了要檢查的對象"10",這是is_a_number?的接收器,所以你的方法不需要帶任何參數。

因爲matchString上的實例方法,所以不需要爲它指定接收方。它只會在調用is_a_number?的同一個對象上運行。因爲您知道您已有String對象,因此也不需要to_s

只是把它寫成:

class String 
    # check if string is either an INT or a FLOAT (12, 12.2, 12.23 would return true) 
    def is_a_number? 
    match(/\A[+-]?\d+?(\.\d+)?\Z/) != nil 
    end 
end 

Ramon's建議,你可以把它放到你的擴展上Object而非String是一個很好的點,如果你不知道,如果你正在測試的對象是將成爲一個字符串。


此外,什麼你所描述的是不是真的什麼是方法鏈接的意思;它只是調用一個對象的方法。方法鏈是其中的方法的返回類型設置,使幾種方法可以在Rails的序列e.g叫,像

User.where(:name => 'Mike').limit(3) # find the first 3 Mikes 

是方法鏈的一個例子。

1

好像要修補Object,而不是String(因爲你在呼喚to_s):

class Object 
    def is_a_number? 
    to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/).nil? 
    end 
end 

你也可以看看它與validates numericality: true您的型號更換。