Ruby如何编写一个连续的分区

时间:2017-07-28 17:06:20

标签: ruby ruby-on-rails-4

如何编写有效实现此功能的方法?

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是一种优雅的语言,它必须是一种更好,更有效的方法。 (可能像reduceinject?)

2 个答案:

答案 0 :(得分:8)

确实注入(或减少),但to_ffdiv可以一次完成[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 }