我是 Ruby 的新手,并试图理解为什么它有效(它似乎确实如此,至少根据 "the Master" ):
def array_of_fixnums?(array)
true unless array.find { |item| item.class != Fixnum }
end
我担心的是,当数组包含非固定数值时,“虚假性”从何而来。我是否可以假设 unless
语句中没有隐含的“else false
”?在那种情况下,我假设它必须来自 Enumerable#find
返回的 nil
值。对吗?
如果是这样,那似乎有点不稳定。像这样显式返回 false
会更好吗?
array.find { |item| item.class != Fixnum } ? false : true
还有其他更好的方法吗?感谢您帮助我解决这个问题,并提供任何“最佳实践”建议。
您的方法正在返回 nil
不是因为 find
返回 nil
,但是因为如果您的内联条件没有通过,则该方法没有明确的返回值。如果它不是内联的,这会更清楚,考虑:
def array_of_fixnums?(array)
unless array.find { |item| item.class != Fixnum }
return true
end
# otherwise don't explicitly return (implicit nil)
end
同时依赖于 nil
的虚假性通常会工作,但它的问题在于它没有遵循最小惊奇原则。 ?
方法应该返回真或假。
但是你的方法有更严重的问题。它使用令人困惑的逻辑(双重否定),本身依赖于nil
的虚假性。和不的真实性nil
, 发挥作用。考虑如果您的方法通过 [false]
会发生什么.糟糕。
更好的方法是这样的:
array.all? {|n| n.is_a? Fixnum }
理由是这个方法完全按照它说的做,很明显。
显式返回 bool 值虽然不一定是错误的,但却是多余的并且通常被认为是不好的做法。而是考虑这个示例,说,用 ruby 语言来说,这个数组中的每个值都是 Fixnum 吗?。 那个表达式的结果就是这个方法的结果;没有理由评估它然后返回 true|false
.
我是一名优秀的程序员,十分优秀!