我在方法声明后显示了一个带有验证的Java方法:
public Integer executeComputation(Integer a, Integer b) {
Validate.notNull(a);
Validate.notNull(b);
Validate.isTrue(b != 0);
return a/b;
}
将此方法调用转换为ruby代码是一个好习惯,如下所示:
def execute_computation(a,b)
raise 'a is nil' if a.nil?
raise 'b is nil' if b.nil?
raise 'zero division' if b == 0
a/b
end
这是一个微不足道的例子,但我觉得对于Ruby来说它太健谈了。然而,我常常用Java中的公共方法检查我的参数,以防止一些难以发现的NPE。
有人可以解释Ruby中的参数验证是如何工作的吗?理想情况下,一些文献参考。
答案 0 :(得分:1)
最好快速失败。仅当您有一些要满足的强限制时才检查类型。除了运行时,还会抛出异常。
答案 1 :(得分:1)
Ruby是一种鸭子类型的语言。 Java不是。 Confident Ruby代码不会检查参数的类型。如果你必须检查类型,这是一种气味。验证应该是值,而不是类型。
如何处理运行时异常NoMethodError: undefined method '/' for nil:NilClass
和/或TypeError: nil can't be coerced into Fixnum
和/或ZeroDivisionError: divided by 0
?
答案 2 :(得分:1)
如果你觉得你需要进行价值验证并且过于健谈,那就使用一个让你不那么健谈的模块,就像你的公共模块那样。
module Validate
def self.not_zero val
raise ArgumentError, 'arg is zero' if val == 0
end
end
def execute_computation(a,b)
Validate.not_zero b
a/b
end