Ruby: Cách lấy ký tự đầu tiên của chuỗi


113

Làm cách nào để lấy ký tự đầu tiên trong chuỗi bằng Ruby?

Cuối cùng, những gì tôi đang làm là lấy họ của ai đó và chỉ tạo một chữ cái đầu từ họ.

Vì vậy, nếu chuỗi là "Smith", tôi chỉ muốn "S".


10
Là một mặt lưu ý, nếu bạn đang ở trong Rails bạn chỉ có thể làm'Smith'.first
Walking Wiki

Ruby 1.9+ có"Smith".chr #=> "S"
Tyler James Young

Câu trả lời:


128

Bạn có thể sử dụng các lớp mở của Ruby để làm cho mã của bạn dễ đọc hơn nhiều. Ví dụ, điều này:

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

sẽ cho phép bạn sử dụng initialphương thức trên bất kỳ chuỗi nào. Vì vậy, nếu bạn có các biến sau:

last_name = "Smith"
first_name = "John"

Sau đó, bạn có thể nhận được các chữ cái đầu rất rõ ràng và dễ đọc:

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

Phương pháp khác được đề cập ở đây không hoạt động trên Ruby 1.8 (không phải là bạn nên sử dụng 1.8 nữa! - nhưng khi câu trả lời này được đăng, nó vẫn khá phổ biến):

puts 'Smith'[0]           # prints 83

Tất nhiên, nếu bạn không làm điều đó thường xuyên, thì việc xác định phương pháp có thể là quá mức cần thiết và bạn chỉ có thể thực hiện trực tiếp:

puts last_name[0,1] 

101

Nếu bạn sử dụng phiên bản Ruby gần đây (1.9.0 trở lên), những điều sau sẽ hoạt động:

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

Nếu bạn sử dụng 1.9.0+ hoặc 1.8.7, những điều sau sẽ hoạt động:

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

Nếu bạn sử dụng phiên bản cũ hơn 1.8.7, điều này sẽ hoạt động:

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

Lưu ý rằng 'Smith'[0,1]không không làm việc trên 1,8, nó sẽ không cung cấp cho bạn những ký tự đầu tiên, nó sẽ chỉ cung cấp cho bạn là người đầu tiên byte .


1
lưu ý rằng điều này chỉ hoạt động trong ruby19. trong ruby18 "Smith"[0]sẽ trả về giá trị nguyên của ký tự 'S'. Cả hai phiên bản đều tuân theo "Smith"[0,1] == "S".
rapter

@raamonds: Chắc chắn rồi, nhưng không có dấu hiệu nào cho thấy câu hỏi OP không sử dụng phiên bản mới nhất, vậy tại sao phải làm phức tạp mọi thứ?
Jörg W Mittag

4
Ruby 1.8 không phải là di sản! Dòng Ruby 1.8 vẫn được hỗ trợ và rất có thể sẽ có phiên bản 1.8.8 được phát hành. Hơn nữa, cả JRuby và Rubinius đều chưa hỗ trợ 1.9. Tôi dám cá 5 đô la rằng ngày nay có nhiều người dùng 1,8 hơn 1,9.
Marc-André Lauckyne

3
@ Jörg: Câu trả lời "Smith"[0,1]không hoạt động trên 1.8 (giả sử ASCII). Không chắc tại sao bạn lại giả định quá nhiều về người yêu cầu, cũng như về những người khác muốn học hỏi từ câu hỏi đó. Ví dụ: Mac OS X đi kèm với Ruby 1.8, vì vậy những người dùng này không cần cài đặt.
Marc-André Lauckyne

3
Làm thế nào để bạn lấy tên viết tắt 'Ångström' (trong UTF-8) để nó hoạt động như mong đợi trong cả Ruby 1.8.x và 1.9.x? Cả hai phương pháp được đề xuất đều không hoạt động trong 1.8.x.
Lars Haugseth

30
"Smith"[0..0]

hoạt động ở cả ruby ​​1.8 và ruby ​​1.9.


1
Đó là giải pháp tốt nhất nếu yêu cầu hỗ trợ 1.8.6 và 1.9.
plang



12

Trong đường ray

name = 'Smith'
name.first 

cách sử dụng dễ dàng. Cảm ơn về câu trả lời.
AMIC MING

12

Thử cái này:

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

HOẶC LÀ

>> "Smith".chr
#=> "S"

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

1
lưu ý rằng điều này chỉ hoạt động trong ruby19. trong ruby18 "Smith"[0]sẽ trả về giá trị nguyên của ký tự 'S'. Cả hai phiên bản đều tuân theo "Smith"[0,1] == "S".
rapter

1
@raosystem: thật vậy. Tôi muốn thêm điều đó "Smith"[0] == ?Sđúng trên cả Ruby 1.8 và 1.9
Marc-André La xui xẻo

2

Bởi vì một lựa chọn thiết kế khó chịu trong Ruby trước 1.9 - some_string[0]trả về mã ký tự của ký tự đầu tiên - cách dễ hiểu nhất để viết điều này là some_string[0,1], nó yêu cầu nó lấy một chuỗi con ở chỉ mục 0 dài 1 ký tự.


str [0,1] cũng không hoạt động giống nhau trong 1.8 và 1.9, vì ở phần trước nó trả về byte đầu tiên trong khi ở phần sau nó trả về ký tự đầu tiên .
Lars Haugseth

1
Đó không thực sự là một sự khác biệt trong cách lập chỉ mục hoạt động nhiều như trong hỗ trợ ngôn ngữ multibyte của 1.9. Cả hai đều nhằm trả lại ký tự đầu tiên, nhưng 1.8 có một cái nhìn ngây thơ hơn về "ký tự" là gì.
Chuck

2

Một tùy chọn khác chưa được đề cập:

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

0

Bạn cũng có thể dùng truncate

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

hoặc để định dạng bổ sung:

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

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

-1

Bất kỳ phương pháp nào sau đây sẽ hoạt động:

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

1
Không có phương pháp nào trong số này sẽ hoạt động với điều đó .sau đó name. Và cách cuối cùng là không hợp lý ngay cả khi bạn loại bỏ ., bởi vì nó sử dụng hai phương pháp khác nhau để thực hiện cùng một điều - [0] chr() .
jeffdill2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.