Рубі: Як отримати перший символ рядка


113

Як я можу отримати перший символ у рядку за допомогою Ruby?

Зрештою, те, що я роблю, - це взяти чиєсь прізвище та просто створити з нього початкове.

Отже, якщо рядок був "Smith", я просто хочу "S".


10
Як зауваження, якщо ви знаходитесь в Rails, ви можете просто зробити'Smith'.first
Ходьба Вікі

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
зауважте, що це працює лише в рубіні19. у ruby18 "Smith"[0]поверне ціле число символу 'S'. Обидві версії підкоряються "Smith"[0,1] == "S".
чемпіон

@rampion: Звичайно, але в питанні немає жодної вказівки, що ОП не використовує найновішу версію, тож навіщо турбувати ускладнення?
Йорг W Міттаг

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

3
@ Йорг: Відповідь "Smith"[0,1]працює на 1.8 (припускаючи ASCII). Не впевнений, чому ви так багато припускаєте про запитувача, а також про всіх інших, хто хотів би дізнатися з цього питання. Наприклад, Mac OS X поставляється в комплекті з Ruby 1.8, тому для цих користувачів установка не потрібна.
Марк-Андре Лафортун

3
Як би ви отримали початкову назву "Ångström" (в UTF-8), щоб вона працювала так, як очікувалося, і в Ruby 1.8.x і 1.9.x? Жоден із запропонованих методів не працював би у 1.8.x.
Ларс Хагсет

30
"Smith"[0..0]

працює як в рубіні 1,8, так і в рубіні 1,9.


1
Це найкраще рішення, якщо потрібна підтримка 1.8.6 та 1.9.
plang





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

1
зауважте, що це працює лише в рубіні19. у ruby18 "Smith"[0]поверне ціле число символу 'S'. Обидві версії підкоряються "Smith"[0,1] == "S".
чемпіон

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
Жоден із цих методів не буде працювати з цим .після name. І останнє не є чуттєвим, навіть якщо ви видалите. , тому що для цього робиться два різні методи - [0] і chr() .
jeffdill2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.