Так, вроде последнее осталось.
Лучше так:

```ruby
def sum(initial_value = 0)
  if block_given?
    array.inject(:+) + initial_value
  else
    array.inject(initial_value) { |sum, n| sum + yield(n) }
  end
end
```
Или даже так:

```ruby
def sum(initial_value = 0)
  array.inject(initial_value) do |sum, n|
    if block_given?
      sum + yield(n)
    else
      sum + n
    end
  end
end
```