Как работает Integer === 3?
Итак, насколько я понимаю, ===
оператор проверяет, является ли объект RHS членом объекта LHS. В этом есть смысл. Но как это работает в Ruby? Я смотрю на документы по Ruby и вижу только ===
определяется в Object
Я не вижу этого в Integer
сам. Это просто не задокументировано?
3 ответа
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
Так как члены этого набора чувствуют себя совершенно естественно, но если нет, то это звучит странно.
До сих пор я не смог придумать краткое описание того, что именно ===
средства. На самом деле, я даже не придумал для этого хорошего названия. Обычно его называют оператором тройного равенства, оператором тройного равенства или оператором равенства регистра, но я сильно не люблю эти имена, потому что он не имеет абсолютно никакого отношения к равенству.
Итак, что это делает? Лучшее, что я придумал: представьте, что вы создаете таблицу, а один из заголовков столбцов Integer
, Будет ли смысл писать 3
в этом столбце? Если один из заголовков столбца /ab*a/
есть ли смысл писать 'abbbba'
в этом столбце?
Исходя из этого определения, его можно назвать оператором подстановки, но это даже хуже, чем в других примерах...
Это определено в модуле, класс которого является подклассом, экземпляром которого является Integer.
Другими словами, когда вы бежите Integer === 3
вы вызываете '===' (с параметром 3) для объекта, на который ссылается константа Integer, которая является экземпляром класса с именем Class. Поскольку Class является подклассом Module и не определяет его собственный ===
, вы получите реализацию ===, определенную в модуле.
См. API документы для модуля для получения дополнительной информации.