有没有办法在红宝石中使用一个衬垫应用多种方法?

时间:2014-06-26 12:47:37

标签: ruby-on-rails ruby

有一个这样的数组:

a = [1,2,3,4]

我希望得到sizesum的返回值。

size = a.size
sum = a.sum

有没有办法像这样通过单行获取两个值?

size, sum = a.some_method(&:size, &:sum)

4 个答案:

答案 0 :(得分:3)

在Ruby中,您可以在一行中执行多项任务:

size, sum = a.size, a.sum

但它并没有让它更具可读性。

答案 1 :(得分:1)

你可以这样做:

a = [1,2,3,4]
methods = [:size, :max, :min, :first, :last]

methods.map { |m| a.send m }
  #=> [4, 4, 1, 1, 4]

答案 2 :(得分:0)

另一种可能的解决方案:

size, sum = a.size, a.reduce { |a,b| a = a + b }

答案 3 :(得分:0)

以前的答案是正确的,但是如果OP实际上担心多次遍历数组,那么array.size不会遍历数组,它只返回长度,因此在这方面没有保存来自oneliner

另一方面,如果size只是一个例子而且问题更多是关于一次对阵列进行多次操作,那么尝试这样的事情:

arr = [1,2,3,4,5,6]

product,sum = arr.inject([1,0]){|sums,el| [sums[0]*el, sums[1]+el]}
# => [720, 21]

也就是说,为结果注入多个初始值,然后计算每个元素的新值。