Ruby: Cara mendapatkan karakter pertama dari sebuah string

113

Bagaimana saya bisa mendapatkan karakter pertama dalam string menggunakan Ruby?

Pada akhirnya yang saya lakukan adalah mengambil nama belakang seseorang dan hanya membuat inisial dari nama itu.

Jadi jika stringnya adalah "Smith", saya hanya ingin "S".

Shpigford
sumber
10
Sebagai catatan tambahan, jika Anda berada di Rails, Anda bisa melakukannya'Smith'.first
Walking Wiki
Ruby 1.9+ memiliki"Smith".chr #=> "S"
Tyler James Young

Jawaban:

128

Anda dapat menggunakan kelas terbuka Ruby agar kode Anda lebih mudah dibaca. Misalnya, ini:

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

akan memungkinkan Anda menggunakan initialmetode ini pada string apa pun. Jadi jika Anda memiliki variabel berikut:

last_name = "Smith"
first_name = "John"

Kemudian Anda bisa mendapatkan inisial dengan sangat bersih dan mudah dibaca:

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

Metode lain yang disebutkan di sini tidak berfungsi di Ruby 1.8 (bukan berarti Anda harus menggunakan 1.8 lagi! - tetapi ketika jawaban ini diposting, itu masih cukup umum):

puts 'Smith'[0]           # prints 83

Tentu saja, jika Anda tidak melakukannya secara teratur, mendefinisikan metode mungkin berlebihan, dan Anda bisa melakukannya secara langsung:

puts last_name[0,1] 
iconoclast
sumber
101

Jika Anda menggunakan Ruby versi terbaru (1.9.0 atau yang lebih baru), berikut ini seharusnya berfungsi:

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

Jika Anda menggunakan 1.9.0+ atau 1.8.7, berikut ini seharusnya berfungsi:

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

Jika Anda menggunakan versi yang lebih lama dari 1.8.7, ini seharusnya berfungsi:

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

Perhatikan bahwa 'Smith'[0,1]tidak tidak bekerja pada 1,8, itu akan tidak memberikan karakter pertama, hanya akan memberikan yang pertama byte .

Jörg W Mittag
sumber
1
perhatikan bahwa ini hanya berfungsi di ruby19. di ruby18 "Smith"[0]akan mengembalikan nilai integer dari karakter 'S'. Kedua versi mematuhi "Smith"[0,1] == "S".
rampion
@rampion: Tentu, tetapi tidak ada indikasi dalam pertanyaan bahwa OP tidak menggunakan versi terbaru, jadi mengapa repot-repot memperumit masalah?
Jörg W Mittag
4
Ruby 1.8 bukan warisan! Garis Ruby 1.8 masih didukung dan kemungkinan besar akan ada versi 1.8.8 yang dirilis. Selain itu, baik JRuby maupun Rubinius belum mendukung 1.9. Saya berani bertaruh $ 5 bahwa saat ini ada lebih banyak pengguna 1,8 daripada 1,9.
Marc-André Lafortune
3
@ Jörg: Jawabannya "Smith"[0,1]berhasil pada 1.8 (dengan asumsi ASCII). Tidak yakin mengapa Anda berasumsi begitu banyak tentang pemohon, serta tentang semua orang yang ingin belajar dari pertanyaan itu. Misalnya, Mac OS X dilengkapi dengan Ruby 1.8, jadi tidak diperlukan penginstalan untuk pengguna ini.
Marc-André Lafortune
3
Bagaimana Anda mendapatkan inisial nama 'Ångström' (dalam UTF-8) sehingga akan berfungsi seperti yang diharapkan di Ruby 1.8.x dan 1.9.x? Tak satu pun dari metode yang disarankan akan bekerja di 1.8.x.
Lars Haugseth
30
"Smith"[0..0]

bekerja di ruby ​​1.8 dan ruby ​​1.9.

Andrew Grimm
sumber
1
Itu solusi terbaik jika dukungan 1.8.6 dan 1.9 diperlukan.
plang
14

Di MRI 1.8.7 atau lebih tinggi:

'foobarbaz'.each_char.first
Wayne Conrad
sumber
12

Di Rails

name = 'Smith'
name.first 
Suganya
sumber
cara mudah digunakan. Terima kasih atas jawabannya.
AMIC MING
12

Coba ini:

>> a = "Smith"
>> a[0]
=> "S"

ATAU

>> "Smith".chr
#=> "S"
Gagan Gami
sumber
5
>> s = 'Smith'                                                          
=> "Smith"                                                              
>> s[0]                                                                 
=> "S"                                                        
SilentGhost
sumber
1
perhatikan bahwa ini hanya berfungsi di ruby19. di ruby18 "Smith"[0]akan mengembalikan nilai integer dari karakter 'S'. Kedua versi itu patuh "Smith"[0,1] == "S".
rampion
1
@rampion: memang. Saya akan menambahkan bahwa "Smith"[0] == ?Situ benar pada Ruby 1.8 dan 1.9
Marc-André Lafortune
2

Karena pilihan desain yang mengganggu di Ruby sebelum 1.9 - some_string[0]mengembalikan kode karakter dari karakter pertama - cara paling portabel untuk menulis ini adalah some_string[0,1], yang memberitahukannya untuk mendapatkan substring pada indeks 0 yang panjangnya 1 karakter.

Membuang
sumber
str [0,1] juga tidak berfungsi sama di 1.8 dan 1.9, seperti di versi sebelumnya, str [0,1] mengembalikan byte pertama sedangkan di yang terakhir mengembalikan karakter pertama .
Lars Haugseth
1
Itu sebenarnya bukan perbedaan dalam cara kerja pengindeksan seperti dalam dukungan 1.9 untuk bahasa multibyte. Keduanya dimaksudkan untuk mengembalikan karakter pertama, tetapi 1,8 memiliki pandangan yang lebih naif tentang apa itu "karakter".
Chuck
2

Opsi lain yang belum disebutkan:

> "Smith".slice(0)
#=> "S"
jeffdill2.dll
sumber
0

Anda juga bisa menggunakan truncate

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

atau untuk pemformatan tambahan:

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

> 'Smith'.truncate(2, omission: '.')
#=> "S."
Eric Norcross
sumber
-1

Salah satu metode berikut akan berfungsi:

name = 'Smith'
puts name.[0..0] # => S
puts name.[0] # => S
puts name.[0,1] # => S
puts name.[0].chr # => S
Saranki Magenthirarajah
sumber
1
Tak satu pun dari metode ini akan berhasil .setelah itu name. Dan yang terakhir tidak masuk akal meskipun Anda menghapus ., karena menggunakan dua metode berbeda untuk melakukan hal yang sama - [0] dan chr() .
jeffdill2