рубин тройной равный - PullRequest
11 голосов
/ 11 апреля 2011

Допустим, у меня следующий код.

result = if a.is_a?(Class) && a <= Exception
   a.name
elsif ...
elsif ...
end

Я изменил код этого кода на

case a
when Exception
     a.name
when ...
when ...
end

Правильно ли я понимаю тройное равенство?

Ответы [ 2 ]

56 голосов
/ 11 апреля 2011

Мы не можем сказать, действительно ли вы получили === или нет из такого ограниченного примера. Но вот подробное описание того, что действительно происходит, когда вы используете ===, явно или неявно, как часть оператора case / when, такого как оператор, использованный в примере ..

Тройное равенство (===) имеет много разных реализаций, которые зависят от класса левой части. Это на самом деле просто инфиксная запись для метода. ===. Это означает, что следующие утверждения идентичны:

a.=== b
a === b

Разница не очень большая, но это означает, что метод левой стороны === вызывается вместо некоторого магического оператора, определенного на уровне языка, это похоже на ==, но не совсем. Вместо этого === определяется в каждом классе, который его использует, может быть, в унаследованном классе или Mixin.

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

В случае Class. === операция вернет true, если аргумент является экземпляром класса (или подкласса). В случае, когда левая сторона является регулярным выражением, она возвращает true, когда правая сторона соответствует регулярному выражению.

Когда case является подразумеваемым ===, который сравнивает переменную case с предложением when, используя ===, так что следующие два оператора дают одинаковый результат.

case a
when String
  puts "This is a String"
when (1..3)
  puts "A number between 1 and 3"
else
  puts "Unknown"
end

if String === a 
  puts "This is a String"
elsif (1..3) === a
  puts "A number between 1 and 3"
else
  puts "Unknown"
end

Проверьте документацию о типах, которые вы используете, слева от оператора === или в операторе when, чтобы точно знать, как все работает.

2 голосов
/ 11 апреля 2011

Я считаю, что в вашем первом примере вы проверяете, является ли a подклассом Exception (поправьте меня, если я ошибаюсь)Второй пример просто проверяет, является ли a экземпляром Exception (эквивалентно a.is_a?(Exception)).

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