Оператор ===
не является коммутативным, а это означает, что "foo" === /foo/
и /foo/ === "foo"
- это две разные вещи. И заявления case
используют последний порядок.
Фактически, ваш первый пример, используя диапазон, уже показывает, что этот порядок используется. 2 === (1..3)
не будет работать, как и ваш второй и третий пример.
Причина, по которой выбран заказ, также очевидна, по крайней мере, если вы знакомы с тем, как работают операторы в Ruby и OO в целом.
Оператор ===
является нормальным способом, так что еще один способом написания /foo/ === "foo"
является /foo/.===("foo")
- И этот порядок имеет смысл, потому что регулярное выражение не знает, если он соответствует строке, но строка не имеет понятия регулярных выражений и Безразлично» t знать, будет ли он соответствовать одному. Расширенный в ваш первый пример, диапазон знает, является ли элемент частью этого, но элемент не имеет понятия, является ли он частью диапазона.
Попробуйте '/ foo/===" foo "'. Вы изменили свое представление о том, как меняется «случай»? Помните, что только * приемник * неявно полиморфен в Ruby и что 'a === b' эффективно' a .__ send __ (: ===, b) '. –
Я не думал о заказе>. <Спасибо – mdesantis