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".
"Smith".chr #=> "S"
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".
"Smith".chr #=> "S"
Câu trả lời:
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 initial
phươ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]
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 .
"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"
.
"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.
"Smith"[0..0]
hoạt động ở cả ruby 1.8 và ruby 1.9.
Vì lợi ích hoàn chỉnh, vì Ruby 1.9 String # chr trả về ký tự đầu tiên của một chuỗi. Nó vẫn có sẵn trong 2.0 và 2.1.
"Smith".chr #=> "S"
Trong MRI 1.8.7 trở lên:
'foobarbaz'.each_char.first
Thử cái này:
>> a = "Smith"
>> a[0]
=> "S"
HOẶC LÀ
>> "Smith".chr
#=> "S"
>> s = 'Smith'
=> "Smith"
>> s[0]
=> "S"
"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"
.
"Smith"[0] == ?S
đúng trên cả Ruby 1.8 và 1.9
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ự.
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."
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
.
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]
và chr()
.
'Smith'.first