Как извлечь один символ (как строку) из большей строки в Ruby?

Что такое идиотский способ Ruby для извлечения одного символа из строки в виде односимвольной строки? Конечно, существует метод str[n], но (с Ruby 1.8) он возвращает код символа как fixnum, а не строку. Как вы попадаете в односимвольную строку?

Ответы

Ответ 1

В Ruby 1.9 легко. В Ruby 1.9 строки имеют кодирующие последовательности символов, поэтому вы можете просто индексировать их, и вы получите из него одну символьную строку:

'µsec'[0] => 'µ'

Однако в Ruby 1.8 строки являются последовательностями байтов и, таким образом, полностью не знают о кодировании. Если вы индексируете строку и эта строка использует многобайтовую кодировку, вы рискуете индексировать ее прямо в середине многобайтового символа (в этом примере "μ" кодируется в UTF-8):

'µsec'[0] # => 194
'µsec'[0].chr # => Garbage
'µsec'[0,1] # => Garbage

Однако, регулярные выражения и некоторые специализированные строковые методы поддерживают по меньшей мере небольшое подмножество популярных кодировок, среди которых некоторые японские кодировки (например, Shift-JIS) и (в этом примере) UTF-8:

'µsec'.split('')[0] # => 'µ'
'µsec'.split(//u)[0] # => 'µ'

Ответ 3

Должен работать для Ruby до и после 1.9:

'Hello'[2,1]  # => "l"

См. комментарий Jörg Mittag: это верно только для однобайтовых наборов символов.

Ответ 4

'abc'[1..1] # => "b"

Ответ 5

'abc'[1].chr # => "b"