Как работает 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 документы для модуля для получения дополнительной информации.

Хм, Integer является подклассом Object.

Другие вопросы по тегам