Ruby: как получить первый символ строки


113

Как я могу получить первый символ в строке с помощью Ruby?

В конечном итоге я просто беру чью-то фамилию и создаю из нее инициалы.

Так что, если строка была «Смит», я просто хочу «S».


10
В качестве примечания: если вы работаете в Rails, вы можете просто сделать'Smith'.first
Walking Wiki

Ruby 1.9+ имеет"Smith".chr #=> "S"
Тайлер Джеймс Янг

Ответы:


128

Вы можете использовать открытые классы Ruby, чтобы сделать ваш код более читабельным. Например, это:

class String
  def initial
    self[0,1]
  end
end

позволит вам использовать initialметод для любой строки. Итак, если у вас есть следующие переменные:

last_name = "Smith"
first_name = "John"

Тогда вы можете получить инициалы очень четко и легко:

puts first_name.initial   # prints J
puts last_name.initial    # prints S

Другой метод, упомянутый здесь, не работает в Ruby 1.8 (не то чтобы вы все равно должны были использовать 1.8! - но когда этот ответ был опубликован, он все еще был довольно распространенным):

puts 'Smith'[0]           # prints 83

Конечно, если вы не делаете это на регулярной основе, тогда определение метода может быть излишним, и вы можете просто сделать это напрямую:

puts last_name[0,1] 

101

Если вы используете последнюю версию Ruby (1.9.0 или новее), следующее должно работать:

'Smith'[0] # => 'S'

Если вы используете 1.9.0+ или 1.8.7, должно работать следующее:

'Smith'.chars.first # => 'S'

Если вы используете версию старше 1.8.7, это должно работать:

'Smith'.split(//).first # => 'S'

Обратите внимание , что 'Smith'[0,1]это не работает на 1.8, это не даст вам первый символ, это даст вам только первый байт .


1
обратите внимание, что это работает только в ruby19. в ruby18 "Smith"[0]вернет целое значение символа "S". Обе версии подчиняются "Smith"[0,1] == "S".
rampion

@rampion: Конечно, но в вопросе нет указания на то, что OP не использует самую последнюю версию, так зачем усложнять вещи?
Jörg W Mittag

4
Ruby 1.8 не является наследием! Линия Ruby 1.8 все еще поддерживается, и, скорее всего, будет выпущена версия 1.8.8. Более того, ни JRuby, ни Rubinius пока не поддерживают 1.9. Я готов поспорить на 5 долларов, что сегодня пользователей 1,8 гораздо больше, чем 1,9.
Марк-Андре Лафортюн

3
@ Jörg: Ответ "Smith"[0,1]работает на 1.8 (при условии, что ASCII). Не уверен, почему вы так много думаете о запросившем, а также обо всех, кто хотел бы узнать из этого вопроса. Например, Mac OS X поставляется в комплекте с Ruby 1.8, поэтому для этих пользователей установка не требуется.
Marc-André Lafortune,

3
Как бы вы получили начальную букву имени «Ангстрём» (в UTF-8), чтобы оно работало должным образом в Ruby 1.8.x и 1.9.x? Ни один из предложенных методов не будет работать в 1.8.x.
Ларс Хаугсет,






5
>> s = 'Smith'                                                          
=> "Smith"                                                              
>> s[0]                                                                 
=> "S"                                                        

1
обратите внимание, что это работает только в ruby19. в ruby18 "Smith"[0]вернет целое значение символа "S". Обе версии подчиняются "Smith"[0,1] == "S".
rampion

1
@rampion: действительно. Я бы добавил, что "Smith"[0] == ?Sэто верно как для Ruby 1.8, так и для 1.9
Marc-André Lafortune

2

Из-за раздражающего выбора дизайна в Ruby до 1.9 - some_string[0]возвращает символьный код первого символа - самый переносимый способ записать это some_string[0,1], который говорит ему получить подстроку с индексом 0 длиной в 1 символ.


str [0,1] не работает одинаково в 1.8 и 1.9, так как в первом он возвращает первый байт, а во втором - первый символ .
Ларс Хаугсет

1
На самом деле это не разница в том, как работает индексация, как в поддержке многобайтовых языков в 1.9. Оба они предназначены для возврата первого символа, но 1.8 имеет более наивное представление о том, что такое «персонаж».
Чак

2

Еще один вариант, о котором еще не упоминалось:

> "Smith".slice(0)
#=> "S"

0

Вы также можете использовать truncate

> 'Smith'.truncate(1, omission: '')
#=> "S"

или для дополнительного форматирования:

> 'Smith'.truncate(4)
#=> "S..."

> 'Smith'.truncate(2, omission: '.')
#=> "S."

-1

Подойдет любой из этих методов:

name = 'Smith'
puts name.[0..0] # => S
puts name.[0] # => S
puts name.[0,1] # => S
puts name.[0].chr # => S

1
Ни один из этих методов не будет работать с этим .AFTER name. И последний вариант бессмысленен, даже если вы удалите его ., потому что он использует два разных метода для одного [0] и того же - иchr() .
jeffdill2 08
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.