Важно понимать, что ()
является оператором, как +
или &&
. ()
Выполняет функцию и вызывает ее.
Итак, в этом случае doThis
является функциональным объектом, а ()
- оператором, вызывающим функцию. doThis()
, объединенный вместе, вызывает doThis
, выполняет его и оценивает возвращаемое значение doThis
. Таким образом, window.onload = doThis()
в основном присваивает возвращаемое значение от doThis
до window.onload
И, таким образом, чтобы исправить это, вам нужно обратиться к самой функции, а не вызвать ее.
Do window.onload = doThis
Попробуйте следующее:
array.inject(0){|sum,x| sum + x }
См. Перечисляемую документацию Ruby
(примечание: необходим базовый вариант 0
, чтобы 0
возвращался в пустом массиве вместо nil
)
3 путями мы можем сделать сумму массива
1) array.inject(0){|sum,x| sum + x }
2) array.inject('+')
3) array.join('+')
Или попробуйте способ Ruby 1.9:
array.inject(0, :+)
Примечание: необходим базовый вариант 0
, иначе nil
будет возвращен для пустых массивов:
> [].inject(:+)
nil
> [].inject(0, :+)
0
Для Ruby > = 2.4.0 вы можете использовать sum
из Enumerables.
[1, 2, 3, 4].sum
Базовые классы mokeypatch опасны. Если вам нравится опасность и вы используете старую версию Ruby, вы можете добавить #sum
в класс Array
:
class Array
def sum
inject(0) { |sum, x| sum + x }
end
end
В качестве альтернативы (для сравнения), если у вас установлен Rails (на самом деле только ActiveSupport):
require 'activesupport'
array.sum