2012-04-25 7 views
1

Как и в заголовке - например, у меня есть метод DrawMe(what), и я хочу разрешить запуск этого метода, когда аргумент what равен одному из следующих значений: {"house", "garden", "cat", "dog"} - и если нет, то этот метод должен быть остановлена ​​и должна быть напечатана ошибка. Есть идеи?Задание допустимых значений для параметра метода

+1

Рассмотрите возможность использования символов, не струнные –

ответ

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' 

Однако, обратите внимание, что большую часть времени вы не должны быть обеспечение того, разработчики прошли правильный тип значения в ваш метод. Ваш метод будет поднимать свою собственную ошибку, если что-то взрывается в результате неправильного использования; это пустая трата времени и времени компьютера, чтобы попытаться проверить и уловить такие ошибки.

Edit: Если вам нужно использовать это часто, вы можете monkeypatch его везде:

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

спасибо! Я думал о чем-то подобном, но есть ли какой-нибудь другой (более простой/короткий) способ сделать такой взгляд в рубинах/рельсах? EDIT: спасибо за предложение, но я в настоящее время разрабатываю свой первый рубиновый драгоценный камень, и мне действительно нужна эта функция;) – mrmnmly

+0

Что-то короче, чем 'raise '...', если только FOO.include? (Bar)'? Как что? Как это может быть намного короче? Вы должны сказать, что это терпит неудачу, вы должны сказать, какие значения являются законными, и вы должны сказать, какое значение нужно проверить. Вы можете опустить приятное сообщение, если хотите. – Phrogz

+0

Я просто подумал, что, возможно, эта функция (метод запуска только с указанными значениями) реализована в некотором buit-in-методе в ruby ​​/ rails, который я не знал, - еще раз спасибо;) – mrmnmly

Смежные вопросы