2010-07-01 17 views
13

Jaka jest różnica między == a ===? Których należy użyć, kiedy?Operatory porównania Ruby? == vs. ===

+0

Jest naprawdę solidne odpowiedź na to w [Jaka jest różnica między równymi ?, eql ?, === i ==?] (http://stackoverflow.com/questions/7156955/whats-the-difference-between-equal-eql-and) –

Odpowiedz

0

== służy do równości w instrukcji warunkowych jak if, unless itp === służy do określenia równości w case wypowiedzi.

+3

Jako przykład, 10 nie jest równe 1..20, ale mieści się w tym zakresie. Możesz więc chcieć umieścić zakres w swoim oświadczeniu o sprawie i go wybrać. Zwróć też uwagę, że instrukcje case tłumaczą się na b === a w instrukcjach takich jak 'case a, gdy b to true end'' –

22

Obie są po prostu metodami wywoływanymi na obiektach. Oznacza to, że obiekty decydują, co znaczy co. W Rubim istnieją jednak konwencje dotyczące tego, jak są one różne. Zwykle == jest bardziej rygorystyczne niż === - prawie zawsze jest prawdziwe, jeśli jest a == b. Najlepszym miejscem na przeczytanie tego jest http://ruby-doc.org/core/classes/Object.html. Przewiń w dół do różnych sekcji o numerach == i ===. Oto niektóre z konwencjami wiem o:

  • == po nałożeniu na zwykły Object s, będzie tylko prawda, jeśli ktoś jest dokładnie taka sama jak inne - jeśli są one przechowywane w miejscu samej pamięci (ta jak działa wewnętrznie Ruby). Jeśli argumenty są typu innego niż Object, ta metoda będzie zwykle nadpisywana.
  • equal? jest podobna do == dla zwykłych Object s, ale nigdy nie zostanie nadpisana przez podklasy.
  • === służy do:
    • z is_a? alternatywa, do tyłu. String === 'str' jest prawdziwe.
    • dopasowanie wyrażeń regularnych. /s[at]r*/ === 'str' jest prawdziwe.

Można znaleźć szczególne znaczenie === dla różnych klas w dokumentacji dla tych klas, na przykład wersja Range jest tutaj (synonim include?): http://ruby-doc.org/core/classes/Range.html#M000691

+1

Dobry przykład przesłaniania' == 'tak, że robi to, czego oczekujesz (prawdopodobnie) jest ciągiem. Porównaj '==' i '.equal' dla literału ciągu i zmiennej wskazującej na" ten sam "ciąg znaków. – Telemachus