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