Kết hợp nhiều chuỗi lại là việc bạn thường làm trong Ruby. Nhưng làm sao? Có hai cách:
- Nối chuỗi Ruby (string concatenation)
- Nội suy chuỗi Ruby (string interpolation)
Nối trông như:
a = "Nice to meet you" b = ", " c = "do you like blueberries?" a + b + c # "Nice to meet you, do you like blueberries?"
Dùng toán tử + nối chuỗi vào chuỗi khác. Trường hợp này, a + b + c tạo chuỗi mới. Không cần biến để làm việc này. Ví dụ:
puts "I like" + " " + "chocolate" # I like chocolate
Tùy chọn khác: toán tử +=. Ví dụ:
a = "" a += "test" a += "test" a += "test" a # "testtesttest"
Bắt đầu chuỗi rỗng & xây dựng chuỗi lớn bằng cách append. Nhưng có vấn đề... Rất chậm! Giải pháp tiếp theo.
Ví Dụ Ruby Concat Method
Dùng phương thức concat Ruby nối chuỗi hiệu quả. Cách:
str = ""
str.concat("a")
str.concat("a")
str # "aa"
Nhanh hơn vì thay đổi chuỗi str, không tạo mới. Nhưng không đẹp như +=... Có cách khác không? Có! Dùng phương thức <<, alias của concat.
Lưu ý: Từ Ruby 2.4, có chút khác biệt, với
concattruyền nhiều đối số, với<<chỉ truyền một tại một thời điểm.
Ví dụ:
str = "" str << "a" str << "a"
Cũng làm được:
str = "" str << "a" << "a"
Vẫn còn một vấn đề. Muốn kết hợp chuỗi với biến, nhưng biến không phải chuỗi, kết quả bất ngờ. Xem:
"" + 1 # TypeError: no implicit conversion of Fixnum into String "" << 1 # "\x01"
Giải pháp? Dùng to_s convert tất cả object thành chuỗi. Như sau:
"" + 1.to_s
Tuy nhiên, nhanh chóng trở nên xấu xí, nên có công cụ khác.
Cách Dùng Ruby String Interpolation
Nội suy hoặc nhúng biến vào chuỗi là kỹ thuật mạnh. Cho phép "templatize" chuỗi. Ví dụ:
age = 33
name = "Jesus"
"Hello, my name is #{name} & I'm #{age} years old."
Chèn bất kỳ name & age bằng cách set biến trước chuỗi. Phần tốt nhất? Ruby lo việc convert giá trị thành chuỗi cho bạn. Không cần gọi to_s! Tuyệt vời.
Prepending Strings (Thêm Vào Đầu)
Cách khác kết hợp chuỗi. Thay vì kết hợp biến & chuỗi nhỏ thành mới bằng "string interpolation". Hoặc append cuối bằng << & concat. Bạn cũng có thể prepend! Ví dụ:
str = ""
str.prepend("1")
str.prepend("2")
str.prepend("3")
# "321"
Nếu nghĩ có method append, thì không có. Chỉ có cho mảng.
Tóm Tắt
Bạn đã học về nối chuỗi, append, prepend & nội suy trong Ruby, cho phép kết hợp nhiều chuỗi. Hãy chia sẻ nếu hữu ích 🙂 Cảm ơn bạn đã đọc.