Проблема возникает, когда переменная, из которой был построен массив, изначально была nil
.
y = (1..2).map do
v = nil
v = 1
v
end
p y # => [1, 1]
p y.class # => Array(Int32)
p y.sum # => 2
Когда v
перестает быть nil
по условию, это потенциально является вычислительным и не решается во время компиляции:
z = (1..2).map do
v = nil
v = 1 if true
v
end
p z # [1, 1]
p z.class # => Array(Nil | Int32)
Массив приобретает более сложный тип, несовместимый с текущей реализацией sum
, поэтому p z.sum
вызывает ошибку времени компиляции:
undefined method 'zero' for Nil:Class (compile-time type is (Nil | Int32):Class)
def sum(initial = T.zero)
^~~~
Как я должен бороться с этим должным образом?
Или, может быть, он ждет лучшей реализации метода stdlib sum
или чего-то еще?
UPD: inject
дает то же самое:
p z.inject{ |i, j| i + j }
undefined method '+' for Nil (compile-time type is (Nil | Int32))