Что такое идиотский способ Ruby для извлечения одного символа из строки в виде односимвольной строки? Конечно, существует метод str[n]
, но (с Ruby 1.8) он возвращает код символа как fixnum, а не строку. Как вы попадаете в односимвольную строку?
Как извлечь один символ (как строку) из большей строки в Ruby?
Ответ 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] # => 'µ'
Ответ 2
До Ruby 1.9:
'Hello'[1].chr # => "e"
Ruby 1.9 +:
'Hello'[1] # => "e"
Много изменилось в Ruby 1.9, включая строковая семантика.
Ответ 3
Должен работать для Ruby до и после 1.9:
'Hello'[2,1] # => "l"
См. комментарий Jörg Mittag: это верно только для однобайтовых наборов символов.
Ответ 4
'abc'[1..1] # => "b"
Ответ 5
'abc'[1].chr # => "b"