0

该方法Array#*采用整数:

thumbs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
thumbs = thumbs*2
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

如何将数组乘以任何浮点数而不仅仅是整数?例如,我希望得到以下结果:

thumbs = thumbs*1.5
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5] 
4

3 回答 3

4
array = [*1..10]
fraction = 1.5
thumbs = array.cycle.take((array.length * fraction).floor)

根据您要如何处理小数情况,您可以使用ceilorround代替floor.

于 2012-07-03T10:32:45.967 回答
1

答案 1

仅仅因为Array * x只定义为使用整数。

答案 2

因为在某些情况下,尚不清楚从中可以得到什么输出。例如

[1,2,3]*1.5

应该输出[1,2]还是[1]

可能的解决方案

不过,您可以定义自己的方法:

class Array
  alias_method :old_mult , :'*'            # remember, how old multiplication worked

  def * other                              # override * method
    result = old_mult(other.floor)         # multiply with floored factor
    end_index = (size * (other % 1)).round # convert decimal points to array index
    result + self[0...end_index]           # add elements corresponding to decimal points
  end
end

p [1,2] * 1
p [1,2,3] * 2
p [1,2,3,4,5] * 1.5
p [1,2,3,4,5,6] * 1.5

这输出

[1, 2]
[1, 2, 3, 1, 2, 3]
[1, 2, 3, 4, 5, 1, 2, 3]
[1, 2, 3, 4, 5, 6, 1, 2, 3]
于 2012-07-03T10:33:41.113 回答
0

您可以定义一个方法并做任何您想做的事情:

def arr_times(f, arr)
  i = float.to_i
  arr*i + arr[0..(((f-i)*arr.length).floor)]
end
于 2012-07-03T10:32:41.400 回答