如何编写有效实现此功能的方法?
divide_array([a,b,c]) # return a.to_f / b.to_f / c.to_f
divide_array([a,b,c,d,e]) # return a.to_f / b.to_f / c.to_f / d.to_f / d.to_f
这是我可以成像的
def divide_array(array)
return false if array.include?(0)
result = 0
array.each_with_index do |i, index|
break if index >= array.size - 1
result = i.to_f / array[index + 1].to_f
end
result
end
但我认为Ruby是一种优雅的语言,它必须是一种更好,更有效的方法。 (可能像reduce
或inject
?)
答案 0 :(得分:8)
确实注入(或减少),但to_f
和fdiv
可以一次完成[3,2,1].inject(:fdiv) #=> 1.5
:
[3,5,6].map(&:to_f).inject(:/) # => 0.09999999999999999
[3,5,6].map(&:to_r).inject(:/).to_f # => 0.1
更精确的是转换为Rationals,并且只能尽可能晚地转换为Float。演示:
[3,5,6].inject(:quo).to_f #=> 0.1
作为sagarpandya82的评论(对我来说是新的),这种向Rational和division的转换也可以一次完成,最终:
<div *ngFor="let product of products; let i = index" #ref>
<md-checkbox type="checkbox"> {{product.productTitle}}</md-checkbox>
<div *ngIf="ref.checked">
<div *ngFor="let item of product.items; let i = index">
<md-checkbox type="checkbox">{{item.code}}</md-checkbox> - {{item.name}}
</div>
</div>
</div>
答案 1 :(得分:5)
这是一种优雅的方式:
[3,2,1].map(&:to_f).reduce(:/)
# => 1.5
没有proc短语的同样的事情:
[3,2,1].reduce { |quotient, el| quotient.to_f / el.to_f }