Невозможно сказать, что именно не так с вашим кодом, похоже, что одна из переменных экземпляра, которую вы используете, инициализируется как строка или аналогично. Введение переменных экземпляра в иностранные классы в целом не является хорошей практикой, также вы злоупотребляете each
для сокращения. Вот код идиоматики c ruby для вашей задачи:
class String
def count_char
each_char.with_object(
{lcase_count: 0, upcase_count: 0, num_count: 0, spl_char_count: 0}
) do |char, acc|
case char
when 'a'..'z' then acc[:lcase_count] += 1
when 'A'..'Z' then acc[:upcase_count] += 1
when '0'..'9' then acc[:num_count] += 1
else acc[:spl_char_count] += 1
end
end
end
end
Обратите внимание, что этот код имеет дело только с простым латинским алфавитом. Лучшим подходом будет сопоставление регулярных выражений, например:
lcase_count = scan(/\P{Lower}/).count
upcase_count = scan(/\P{Upper}/).count
...