2012-04-25 52 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