Как работает Integer === 3? - PullRequest
       4

Как работает Integer === 3?

4 голосов
/ 08 января 2010

Итак, насколько я понимаю, оператор === проверяет, является ли объект RHS членом объекта LHS. В этом есть смысл. Но как это работает в Ruby? Я смотрю на документы по Ruby и вижу только ===, определенный в Object, но не вижу в Integer. Это просто не задокументировано?

Ответы [ 3 ]

8 голосов
/ 08 января 2010

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' в этом столбце?

На основании этого определения его можно назвать оператором подстановки , но это даже хуже, чем в других примерах ...

3 голосов
/ 08 января 2010

Это определено в модуле, класс которого является подклассом, экземпляр которого Integer является экземпляром.

Другими словами, когда вы запускаете Integer === 3, вы вызываете '===' (спараметр 3) объекта, на который ссылается константа Integer, которая является экземпляром класса с именем Class.Поскольку Class является подклассом Module и не определяет его собственный ===, вы получаете реализацию ===, определенную для Module.

См. Документацию API для Module для получения дополнительной информации.информация.

0 голосов
/ 08 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...