0xD34F, я правильно понимаю:
1. блок делится как бы на две строки с помощью точки с запятой? Если бы блок записывался через do - end, то выглядело бы так
do |acc, n|
acc[n] += 1
acc
end
2. acc возвращается при каждом вызове блока, то есть для каждого символа из string?