2010-07-01 45 views
13

Sự khác nhau giữa == và === là gì? Bạn nên sử dụng cái nào?Các toán tử so sánh Ruby? == và ===

+0

Có một thực sự vững chắc trả lời cho câu hỏi này tại [Sự khác biệt giữa bằng nhau là gì ?, eql ?, === và ==?] (http://stackoverflow.com/questions/7156955/whats-the-difference-between-equal-eql-and) –

Trả lời

0

== được sử dụng cho sự bình đẳng trong phát biểu có điều kiện như if, unless vv === được sử dụng để xác định sự bình đẳng trong case báo cáo.

+3

Ví dụ, 10 không bằng 1,20, nhưng nó nằm trong phạm vi đó. Vì vậy, bạn có thể muốn có thể đặt phạm vi trong trường hợp của bạn tuyên bố, và có nó được chọn. Ngoài ra, lưu ý rằng các câu lệnh case chuyển thành b === a trong các câu lệnh như 'case a khi b then true end' –

22

Cả hai chỉ là các phương thức được gọi trên các đối tượng. Điều này có nghĩa rằng các đối tượng quyết định có nghĩa là gì. Tuy nhiên, có những quy ước trong Ruby về cách chúng khác nhau. Thông thường, == nghiêm ngặt hơn === - a === b sẽ gần như luôn đúng nếu a == b là. Nơi tốt nhất để đọc về điều này là http://ruby-doc.org/core/classes/Object.html. Cuộn xuống các phần khác nhau về =====. Dưới đây là một số các công ước tôi biết về:

  • ==, khi áp dụng cho đồng bằng Object s, sẽ chỉ có đúng nếu một là chính xác giống như người kia - nếu chúng được lưu trữ trong cùng một vị trí bộ nhớ (điều này là cách Ruby hoạt động nội bộ). Tuy nhiên, nếu các đối số có các kiểu khác với Object, thì phương thức này thường sẽ bị ghi đè.
  • equal? giống như == cho đồng bằng Object s, nhưng sẽ không bao giờ bị ghi đè bởi lớp con.
  • === đang sử dụng cho:
    • một sự thay thế is_a?, về phía sau. String === 'str' là sự thật.
    • phù hợp với regex. /s[at]r*/ === 'str' là sự thật.

Bạn có thể tìm thấy ý nghĩa cụ thể của === cho các lớp khác nhau trong tài liệu cho các lớp học, ví dụ, phiên bản Range là ở đây (một từ đồng nghĩa với include?): http://ruby-doc.org/core/classes/Range.html#M000691

+1

Một ví dụ tốt về ghi đè' == 'để nó làm những gì bạn (có thể) mong đợi là chuỗi. So sánh '==' và '.equal' cho một chuỗi ký tự và một biến trỏ vào chuỗi" giống nhau ". – Telemachus

Các vấn đề liên quan