inject

class Array
  def sum()
    inject{|x,i| x+i }
  end
end

def f(n)
  n % 7
end

def g(n)
# 3*f((1..7).inject{|x,k| x+k**n})
  3*f((1..7).map{|k| k**n}.sum)
end

p f(10) #=> 3
p g(6)  #=> 18

injectがいるのが気持ち悪く感じる体になってしまった.合計を求めるのに中間変数を見たくない.

とはいえ,これはさすがにやりすぎだと感じる.

class Array
  def sum(nodata=nil)
    return nodata if empty?
    return self[0] if size==1
    self[0] + self[1..-1].sum
  end
end

p [1,2,3,4].sum(0) #=> 10