2012-03-25 2 views
1

Ruby syntax reference говорит о конкретных утверждениях:Почему «foo» не === to/foo/когда матч преуспевает в случае?

Сравнение производится оператором ===

Infact, например:

ruby -e 'puts (1..3) === 2' 

печатает true, но:

ruby -e 'puts "foo" === /foo/' 

печатает false, а также:

ruby -e 'puts :foo === /foo/' 

печатает false, но все эти примеры являются успешными условиями для конкретных заявлений. Как это работает?

+0

Попробуйте '/ foo/===" foo "'. Вы изменили свое представление о том, как меняется «случай»? Помните, что только * приемник * неявно полиморфен в Ruby и что 'a === b' эффективно' a .__ send __ (: ===, b) '. –

+0

Я не думал о заказе>. <Спасибо – mdesantis

ответ

7

Оператор === не является коммутативным, а это означает, что "foo" === /foo/ и /foo/ === "foo" - это две разные вещи. И заявления case используют последний порядок.

Фактически, ваш первый пример, используя диапазон, уже показывает, что этот порядок используется. 2 === (1..3) не будет работать, как и ваш второй и третий пример.

Причина, по которой выбран заказ, также очевидна, по крайней мере, если вы знакомы с тем, как работают операторы в Ruby и OO в целом.

Оператор === является нормальным способом, так что еще один способом написания /foo/ === "foo" является /foo/.===("foo") - И этот порядок имеет смысл, потому что регулярное выражение не знает, если он соответствует строке, но строка не имеет понятия регулярных выражений и Безразлично» t знать, будет ли он соответствовать одному. Расширенный в ваш первый пример, диапазон знает, является ли элемент частью этого, но элемент не имеет понятия, является ли он частью диапазона.

+0

Я чувствовал, что мне не хватает чего-то очевидного. спасибо – mdesantis