2012-04-25 72 views
1

像在標題 - 例如我有一個方法DrawMe(what),我想允許運行此方法時,what參數等於這個值之一:{"house", "garden", "cat", "dog"} - 如果不是,那麼此方法應該被停止並應打印錯誤。有任何想法嗎?指定方法參數的允許值

+1

考慮使用的符號,而不是字符串 – 2012-04-26 13:11:06

回答

5
class Draw 
    ALLOWED = %w[house garden cat dog] 
    def self.me(what) 
    raise ArgumentError, "Unknown drawable '#{what}'" unless ALLOWED.include?(what) 
    # Otherwise, carry on! 
    puts "I'm going to draw a #{what}!" 
    end 
end 

Draw.me('garden') #=> I'm going to draw a garden! 
Draw.me('cat' ) #=> I'm going to draw a cat! 
Draw.me('morals') #=> RuntimeError: Unknown drawable 'morals' 

但是,請注意大部分時間你不應該確保開發人員通過正確類型的值到你的方法。如果由於誤用而爆炸,您的方法將會引發自己的錯誤;這是浪費你的時間和計算機的時間來嘗試檢查和捕獲這樣的錯誤。

編輯:如果你需要經常使用這個,你可以在任何地方猴補丁吧:

class Object 
    def ensure_in(enumerable) 
    unless enumerable.include?(self) 
     raise ArgumentError, "#{self} must be one of #{enumerable}" 
    end 
    end 
end 

def me(what) 
    what.ensure_in(ALLOWED) 
    # Go ahead 
end 
+0

的感謝!我想過這樣的事情,但是有沒有其他的(更簡單/更短?)的方式在ruby/rails中做這樣的想法?編輯:謝謝你的建議,但我目前正在開發我的第一個紅寶石寶石,我真的很想在它的功能;) – mrmnmly 2012-04-25 21:27:06

+0

比'提高'...',除非FOO.include?(酒吧)''?像什麼?這怎麼可能更短?你必須告訴它失敗,你必須告訴它什麼值是合法的,你必須告訴是否有什麼值得檢查。如果你喜歡,你可以省略好消息。 – Phrogz 2012-04-25 21:28:47

+0

我只是認爲,也許這種功能(運行方法只與指定的值)是在ruby/rails的某些buit-in方法中實現的,我不知道 - 無論如何再次感謝;) – mrmnmly 2012-04-25 21:31:57