我花了一些时间试图找到一种方法来对数组中的每个元素进行基本操作,如sum, round等。
我没有看到一个内置的方法来做到这一点,所以我试图创建我自己的后找到"通用的'sum'和'mean'方法为Ruby数组"。
有人能解释为什么我的round
方法不起作用吗?
class Array
def sum
inject(nil) { |sum, x| sum ? sum + x : x }
end
def mean
sum / size
end
def round(p)
inject(nil) { |x| (x * 10 ^ (p-1)).floor / 10 ^ (p - 1) }
end
end
puts [1.1234, 1.45656, 1.546567, 1.4577887].mean
puts [1.1234, 1.45656, 1.546567, 1.4577887].round(6)
您需要以下内容:
class Array
def sum
inject(:+)
end
def mean
sum / size.to_f
end
def round(p)
map { |n| n.round(p) }
end
end
puts [1.1234, 1.45656, 1.546567, 1.4577887].mean
1.3960789249999999
puts [1.1234, 1.45656, 1.546567, 1.4577887].round(6)
1.1234
1.45656
1.546567
1.457789
注意,当数组只包含整数时,需要sum.to_f
(或size.to_f
)。如果arr.sum = 3
和arr.size = 2
, sum / size #=> 1
而sum / size.to_f #=> 1.5
。
要回答你问题的why部分,你的实现有三个问题:
-
概念性:
inject
用于获取一堆事物并将它们组合成一个事物。在这里,您有内容,并希望并列相同数量的其他内容。这个方法是map
:[1, 2, 3].inject(:+) # => 6 [-1, 2, -3].map(&:abs) # => [1, 2, 3]
-
语法:
^
是位异或,不是power to。操作符为**
。 - 基础数学:让我们通过尝试将数字
1.77
四舍五入一个小数点来进行完整性检查:(17.7)。地板/10 = 1.7