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 .
foo.intern == bar.intern
sẽ 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.)