Cách ngắn gọn nhất để kiểm tra bình đẳng chuỗi (không phải bình đẳng đối tượng) cho chuỗi hoặc ký hiệu Ruby?


86

Tôi luôn làm điều này để kiểm tra tính bình đẳng chuỗi trong Ruby:

if mystring.eql?(yourstring)
 puts "same"
else
 puts "different"
end

Đây có phải là cách chính xác để làm điều này mà không cần kiểm tra bình đẳng đối tượng không?

Tôi đang tìm cách ngắn gọn nhất để kiểm tra các chuỗi dựa trên nội dung của chúng.

Với dấu ngoặc đơn và dấu hỏi, điều này có vẻ hơi rắc rối.

Câu trả lời:



14

Mẫu mã của bạn không mở rộng trên một phần chủ đề của bạn, cụ thể là các ký hiệu, và do đó, một phần của câu hỏi chưa được trả lời.

Nếu bạn có hai chuỗi, foo và bar, và cả hai đều có thể là chuỗi hoặc ký hiệu, bạn có thể kiểm tra sự bình đẳng với

foo.to_s == bar.to_s

Sẽ hiệu quả hơn một chút nếu bỏ qua các chuyển đổi chuỗi trên các toán hạng có kiểu đã biết. Vì vậy, nếu foo luôn là một chuỗi

foo == bar.to_s

Nhưng hiệu quả đạt được gần như chắc chắn không đáng để đòi hỏi thêm bất kỳ công việc nào thay cho người gọi.

Trước Ruby 2.2, hãy tránh sử dụng các chuỗi đầu vào không được kiểm soát nhằm mục đích so sánh (với các chuỗi hoặc ký hiệu), vì các ký hiệu không được thu thập rác và do đó bạn có thể tự mình từ chối dịch vụ do cạn kiệt tài nguyên. Giới hạn việc sử dụng các ký hiệu đối với các giá trị bạn kiểm soát, tức là các ký tự trong mã của bạn và các thuộc tính cấu hình đáng tin cậy.

Ruby 2.2 giới thiệu bộ sưu tập ký hiệu rác .


6
foo.intern == bar.internsẽ tốt hơn - đan xen một chuỗi trung bình hiệu quả hơn so với tạo một chuỗi từ một biểu tượng. (Nếu một chuỗi nhất định đã được thực tập nội trú trước đây, nó chỉ trả về biểu tượng.)
Chuck

4
Trên thực tế, tôi không nghĩ rằng nên tạo một biểu tượng từ một chuỗi chỉ để tiết kiệm một chút so với một số phép so sánh vì nó sẽ làm rò rỉ các ký hiệu nếu chuỗi không khớp. Các biểu tượng không được thu thập rác và do đó không nên tạo nếu bạn không có ý định giữ chúng, nếu không, bạn sẽ tạo ra một vectơ cho một cuộc tấn công từ chối dịch vụ.
Patru

Gee, tôi đã không nghĩ đến điều đó. Cảm ơn, tôi đã sửa đổi câu trả lời của mình dựa trên nhận xét của bạn.
sheldonh

1
Điều này cần được trình bày lại: "Tránh xen vào các chuỗi đầu vào không được kiểm soát [...] vì các ký hiệu không được thu gom rác". Xin cảm ơn @sheldonh.
Nate
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.