Jaka jest różnica między == a ===? Których należy użyć, kiedy?Operatory porównania Ruby? == vs. ===
Odpowiedz
==
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.
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'' –
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łyObject
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łychObject
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.
- z
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
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
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) –