Ruby 如果方法';s参数不符合某些标准

Ruby 如果方法';s参数不符合某些标准,ruby,Ruby,如果传递给initialize方法的某些参数与某些条件不匹配,是否可以阻止初始化对象并引发错误 例如,如果我定义了一个类EvenInt,该类有一个属性x,该属性必须是偶数整数,那么是否可以阻止初始化该类的对象,例如,如果我将3作为参数传递 如果是这样的话,你能不能快速解释一下怎么做,特别是如何引起错误。像这样的 class EvenInteger def initialize(number) if number.odd? raise StandardError e

如果传递给initialize方法的某些参数与某些条件不匹配,是否可以阻止初始化对象并引发错误

例如,如果我定义了一个类
EvenInt
,该类有一个属性
x
,该属性必须是偶数整数,那么是否可以阻止初始化该类的对象,例如,如果我将
3
作为参数传递


如果是这样的话,你能不能快速解释一下怎么做,特别是如何引起错误。像这样的

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
,或者甚至定义corse的
standarderor
的特定子类。像这样的

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
或甚至定义
standarderor

的特定子类。当然,只需在
initialize
方法中提出一个错误:

class EnventInt
  def initialize(x)
    @x = x

    raise ArgumentError, "x must be even" unless @x.even?
  end
end

当然,只需在
initialize
方法中引发一个错误:

class EnventInt
  def initialize(x)
    @x = x

    raise ArgumentError, "x must be even" unless @x.even?
  end
end

基本上,您需要检查提供的参数是否符合条件,如果符合,则执行方法应执行的操作,否则引发异常:

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>
或者,如果想要自定义错误类,可以执行以下操作:

NotEvenIntegerArgumentError = Class.new(ArgumentError)
然后在
初始化

raise NotEvenIntegerArgumentError, 'Argument should be an even integer'
或者,如果需要,可以在exception类中设置默认异常消息。整个代码如下所示

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

基本上,您需要检查提供的参数是否符合条件,如果符合,则执行方法应执行的操作,否则引发异常:

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>
或者,如果想要自定义错误类,可以执行以下操作:

NotEvenIntegerArgumentError = Class.new(ArgumentError)
然后在
初始化

raise NotEvenIntegerArgumentError, 'Argument should be an even integer'
或者,如果需要,可以在exception类中设置默认异常消息。整个代码如下所示

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

您可以使用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.)
晚间新闻(2) => # >晚上。新(3) 回溯。。。。。。 ...... ArgumentError(数字应为偶数。)

ArgumentError
指示可以指定的特定错误类型。然后,您会给用户留下一条消息,告诉用户这是怎么回事。

您可以使用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.)
晚间新闻(2) => # >晚上。新(3) 回溯。。。。。。 ...... ArgumentError(数字应为偶数。)

ArgumentError
指示可以指定的特定错误类型。然后,您会给用户留下一条消息,说明这是错误的原因。

这是最好的答案,以避免在给定一个没有这些方法的对象时出现
偶数或
奇数的
命名错误,并避免允许一个不是
整数但实现了这些方法的对象通过。我唯一的想法是,这应该引起
ArgumentError
,因为这是实际的问题,而不是
RuntimeError
,它不是很明确。有什么解释就好了well@engineersmnky没错,用这些编辑编辑了答案:)谢谢!这是最好的答案,以避免在给定一个没有这些方法的对象时出现
偶数
奇数
命名错误,并避免允许一个不是
整数但实现了这些方法的对象通过。我唯一的想法是,这应该引起
ArgumentError
,因为这是实际的问题,而不是
RuntimeError
,它不是很明确。有什么解释就好了well@engineersmnky没错,用这些编辑编辑了答案:)谢谢!