1

タイトルのように-たとえば、メソッドがあり、引数が次の値のいずれかと等しいDrawMe(what)場合にこのメソッドを実行できるようにしたい: -そうでない場合は、このメソッドを停止してエラーを出力する必要があります。何か案は?what{"house", "garden", "cat", "dog"}

4

1 に答える 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'

ただし、ほとんどの場合、開発者が正しい型の値をメソッドに渡すことを保証するべきではないことに注意してください。誤用の結果として何かが爆発した場合、メソッドは独自のエラーを発生させます。このようなエラーをチェックしてキャッチしようとするのは、あなたの時間とコンピュータの時間の無駄です。

編集:これを頻繁に使用する必要がある場合は、どこにでもモンキーパッチを適用できます。

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
于 2012-04-25T21:24:30.563 に答える