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 に答える