my_array.count(0) == my_array.length-1
Run Code Online (Sandbox Code Playgroud)
如果速度很重要,对于可能需要在检测到第二个非零时提前返回的非常大的数组,可能:
def only_one_non_zero?( array )
found_non_zero = false
array.each do |val|
if val!=0
return false if found_non_zero
found_non_zero = true
end
end
found_non_zero
end
Run Code Online (Sandbox Code Playgroud)
最多选择两个非零元素,并检查是否有一个项目可用.
>> [0,1,1].select {|x| !x.zero?}.take(2).size == 1
=> false
>> [0,1,0].select {|x| !x.zero?}.take(2).size == 1
=> true
>> [1,2,3].select {|x| !x.zero?}.take(2).size == 1
=> false
Run Code Online (Sandbox Code Playgroud)
在Ruby 1.8.7中运行良好,但请注意select返回一个数组,因此它不是"最优懒惰". 这是一篇博客文章,展示了如何在Ruby中创建一些懒惰的枚举器.