Задача 12-1: Ошибка при выводе результата `inspect': inspected result must be ASCII only

[Д] Дмитрий, 21 июля 2016, 19:51 , 3 подписчика

При запуске выдаёт ошибку.

read_info.rb:15:in `inspect': inspected result must be ASCII only or use the default external encoding (Encoding::Compatibil
ityError)
        from read_info.rb:15:in `inspect'
        from read_info.rb:15:in `<main>'

Нашёл причину, но как исправить пока всё равно не знаю. Если в read_info.rb в конце изменить puts и написать: puts res, то прога работает.

Обсуждение (5)


Вадим Венедиктов Учитель

[В]

Конструкция "#{a}" применяет к a метод .inspect, который возвращает строку с информацией об объекте в человекопонятной форме. Для строки, скажем, эту самую строку, а для массива — его элементы, с добавленными запятыми и квадратными скобками по краям.

> [1,2,3].inspect
 => "[1, 2, 3]"

А если написать puts res, то произойдёт немного другое, объект будет передан puts-у, а он уже там сам с ним будет колдовать. Скажем, массив выведет по-элементно:

> puts [1,2,3]
1
2
3
 => nil

В нашем случае метод inspect ругается на то, что в том, у чего его вызвали (массив массивов), символы закодированы в UTF-8, чего inspect никак не ждёт. Можно попробовать вызвать у массива метод to_s, тогда должно сработать, но лучше разобрать массив в соответствии с ожиданиями и вывести элементы по отдельности. Как-нибудь так.

puts "Одинаковые профессии у:"

for person in res do
  puts person.to_s
end

Возможно, Миша подскажет что-то ещё.

p.s. В Ubuntu такой проблемы нет, кстати. Попробуй запустить программу через обычную консоль, не rubymine.


[Д]

С to_s совсем никак не воспринимает, всё время ошибки типа этой выдаёт:

read_info.rb:17:in `inspect': inspected result must be ASCII only or use the default exter
nal encoding (Encoding::CompatibilityError)
        from read_info.rb:17:in `inspect'
        from read_info.rb:17:in `<main>'

В варианте с for и в рубимайновской консоли и в обычной выдает ошибку.

read_info.rb:18:in `inspect': inspected result must be ASCII only or use the default exter
nal encoding (Encoding::CompatibilityError)
        from read_info.rb:18:in `block in <main>'
        from read_info.rb:15:in `each'
        from read_info.rb:15:in `<main>'

Если оставить, db.results_as_hash = true, то с for у меня только в таком варианте сработало:

 res.each do |person|
   for pers in person
     puts pers
   end
 end

Ну или просто puts res


Michael Butlitsky Учитель

[M]

Вадик правильно написал, puts res и puts "#{res}" по-разному выводят массивы, и на винде второй вариант нормально с русскими не отработает (он хочет видеть каждый элемент массива в нужной кодировке).

Поэтому мы избегаем массивы внутри строк использовать.


[Д]

А каким образом он меняет кодировку, если мы принудительно прописываем utf-8?


Michael Butlitsky Учитель

[M]

Он не меняет, а ждет, что они будут в ASCII.

Нужно углубляться в особенности работы метода inspect для массивов, чтобы понять почему это происходит.