Выдает ошибку, если параметры метода не соответствуют определенным критериям - PullRequest
0 голосов
/ 05 июня 2018

Можно ли предотвратить инициализацию объекта и вызвать ошибку, если некоторые параметры, переданные методу инициализации, не соответствуют определенным условиям?

Например, если я определю класс EvenInt, которыйимеет один атрибут x, который должен быть четным целым числом, возможно ли предотвратить инициализацию объекта этого класса, например, если я передам 3 в качестве параметра?

Если так, может лиВы быстро объясните, как это сделать, в частности, как вызвать ошибки?

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Вы можете использовать метод Ruby raise, чтобы вызвать ошибку, кроме того, вы также можете написать сообщение, чтобы сообщить пользователю, почему это произошло.

class EvenInt
  attr_reader :x
  def initialize(integer)
    raise ArgumentError, "Number shoud be even." unless integer.even?
    @x = integer
  end
end

Если вы попытаетесь:

> EvenInt.new(2)
=> #<EvenInt:0x00007fbc81019830 @x=2>

> EvenInt.new(3)
Traceback ......
......
ArgumentError (Number shoud be even.)

ArgumentError указывает конкретный тип ошибки, который вы можете указать.Затем вы оставляете сообщение пользователю, почему это не так.

0 голосов
/ 05 июня 2018

Конечно, просто вызовите ошибку в методе initialize:

class EnventInt
  def initialize(x)
    @x = x

    raise ArgumentError, "x must be even" unless @x.even?
  end
end
0 голосов
/ 05 июня 2018

По сути, вам нужно проверить, соответствует ли предоставленный аргумент критериям, и если да, - сделать то, что должен делать метод, в противном случае вызовите исключение:

class EventInt
  def initialize(x)
    if x.is_a?(Integer) && x.even?
      @x = x
    else
      raise 'Argument should be an even integer'
    end
  end
end

EventInt.new(1)
#=> RuntimeError: Argument should be an even integer
EventInt.new(1.1)
#=> RuntimeError: Argument should be an even integer
EventInt.new(1.2)
#=> RuntimeError: Argument should be an even integer
EventInt.new(2)
#=> #<A:0x00007fca4c9a0498 @even_int=2>

На самом деле, было бы больше смысла возвращатьконкретная ошибка, а именно ArgumentError:

raise ArgumentError, 'Argument should be an even integer'

Или, если вы хотите иметь свой собственный класс ошибок, вы можете сделать следующее:

NotEvenIntegerArgumentError = Class.new(ArgumentError)

и затем в initialize:

raise NotEvenIntegerArgumentError, 'Argument should be an even integer'

Или, если хотите, вы можете настроить сообщение об исключении по умолчанию в своем классе исключений.Весь код будет выглядеть следующим образом

class EventInt
  NotEvenIntegerArgumentError = Class.new(ArgumentError) do
    def message
      'Argument should be an even integer'
    end
  end

  def initialize(x)
    if x.is_a?(Integer) && x.even?
      @x = x
    else
      raise NotEvenIntegerArgumentError
    end
  end
end
0 голосов
/ 05 июня 2018

Да, конечно.Примерно так:

class EvenInteger
  def initialize(number)
    if number.odd?
      raise StandardError
    end
    @value = number
  end

  attr_reader :value
end

EvenInteger.new(3)
=> StandardError (StandardError)
EvenInteger.new(4).value
=> 4

Или, может быть, вы можете поднять ArgumentError или даже определить свой конкретный подкласс StandardError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...