Tôi đã đọc tài liệu Ruby và bị nhầm lẫn với sự khác biệt giữa gsub
và tr
. Sự khác biệt giữa hai là gì?
Tôi đã đọc tài liệu Ruby và bị nhầm lẫn với sự khác biệt giữa gsub
và tr
. Sự khác biệt giữa hai là gì?
Câu trả lời:
Sử dụng tr
khi bạn muốn thay thế (dịch) các ký tự đơn.
tr
khớp với các ký tự đơn (không thông qua biểu thức chính quy), do đó, các ký tự không cần xảy ra theo cùng một thứ tự trong đối số chuỗi đầu tiên. Khi tìm thấy một ký tự, nó được thay thế bằng ký tự được tìm thấy tại cùng một chỉ mục trong đối số chuỗi thứ hai:
'abcde'.tr('bda', '123')
#=> "31c2e"
'abcde'.tr('bcd', '123')
#=> "a123e"
Sử dụng gsub
khi bạn cần sử dụng biểu thức chính quy hoặc khi bạn muốn thay thế các chuỗi con dài hơn:
'abcde'.gsub(/bda/, '123')
#=> "abcde"
'abcde'.gsub(/b.d/, '123')
#=> "a123e"
tr
có nghĩa là "dịch", như trong "dịch ký tự", đó chính xác là những gì nó làm. Nó được đặt tên theo tiện ích Unix cùng tên (vốn nổi tiếng với tên ngắn và tối nghĩa).
tr
chỉ có thể thay thế một ký tự bằng một ký tự cố định duy nhất (mặc dù bạn có thể đặt nhiều kết quả khớp loại này trong một tr
cuộc gọi) nhưng rất nhanh.gsub
có thể khớp các mẫu phức tạp bằng regex và thay thế bằng kết quả tính toán phức tạp, nhưng chậm hơn tr
.tr
nhanh hơn nhiều lần gsub
. Đây là một tiêu chuẩn về cách nhanh hơn tr
có thể hơn gsub
. github.com/JuanitoFatas/fast-ruby/blob/master/code/opes/
tr
trả về một bản sao str
với các ký tự được from_str
thay thế bằng các ký tự tương ứng trong to_str
. Nếu to_str
ngắn hơn from_str
, nó được đệm với ký tự cuối cùng của nó để duy trì sự tương ứng.
http://apidock.com/ruby/String/tr
gsub
trả về một bản sao str
với tất cả các lần xuất hiện của mẫu được thay thế cho đối số thứ hai. Các mô hình thường là một Regapi; nếu được đưa ra dưới dạng Chuỗi, mọi ký tự biểu thức chính quy mà nó chứa sẽ được hiểu theo nghĩa đen, ví dụ: \d
sẽ khớp với phản ứng ngược theo sau d
, thay vì chữ số.
http://apidock.com/ruby/String/gsub