Integer
- это класс, который (по крайней мере, в Ruby) означает, что это просто скучный старый нормальный объект, как и любой другой объект, который просто является экземпляром класса Class
(вместо, скажем, , Object
или String
или MyWhateverFoo
).
Class
в свою очередь является подклассом Module
(хотя, возможно, и не должно быть, потому что он нарушает принцип подстановки Лискова, но это обсуждение для другого форума, а также мертвая лошадь, которая уже был избит много много раз). И в Module#===
вы найдете искомое определение, которое Class
наследует от Module
, а экземпляры Class
(например, Integer
) понимают.
Module#===
в основном определен симметрично Object#kind_of?
, он возвращает true
, если его аргумент является экземпляром самого себя. Итак, 3
является экземпляром Integer
, поэтому Integer === 3
возвращает true
, как 3.kind_of?(Integer)
.
Насколько я понимаю, оператор ===
проверяет, является ли объект RHS членом объекта LHS.
Не обязательно. ===
- это метод, как и любой другой метод. Он делает все, что я хочу. И в некоторых случаях аналогия «является членом» нарушается. В этом случае его уже довольно трудно проглотить. Если вы фанат хардкорной теории типов, то просмотр типа как набора и экземпляров этого типа как членов набора вполне естественен. И, конечно, для Array
и Hash
определение «член» также очевидно.
А как же Regexp
? Опять же, если вы любитель формальных языков и знаете свой Chomsky задом наперед, то интерпретация Regexp
как бесконечного набора слов и String
s как членов этого набора кажется совершенно естественной, но если нет, то это звучит странно .
Пока что мне не удалось дать краткое описание точно , что означает ===
. На самом деле, я даже не придумал для этого хорошего названия. Обычно его называют оператором тройного равенства , оператором тройного равенства или оператором равенства , но я сильно не люблю эти имена, потому что он не имеет абсолютно ничего общего с равенством .
Итак, что это делает? Лучшее, что я придумал: представьте, что вы делаете таблицу, а один из заголовков столбцов - Integer
. Имеет ли смысл писать 3
в этом столбце? Если один из заголовков столбца равен /ab*a/
, имеет ли смысл писать 'abbbba'
в этом столбце?
На основании этого определения его можно назвать оператором подстановки , но это даже хуже, чем в других примерах ...