Почему Array не переопределяет метод тройного знака равенства в Ruby? - PullRequest
6 голосов
/ 12 октября 2011

Я только что заметил, что Array не переопределяет метод тройного знака равенства ===, который иногда называют методом равенства регистра.

x = 2

case x
  when [1, 2, 3] then "match"
  else "no match"
end # => "no match"

, тогда как оператор диапазона делает:

x = 2

case x
  when 1..3 then "match"
  else "no match"
end # => "match"

Вы можете сделать обходной путь для массивов, однако:

x = 2

case x
  when *[1, 2, 3] then "match"
  else "no match"
end # => "match"

Известно, почему это так?

Это потому, что это более вероятно для xбыть фактическим массивом, а не диапазоном, и переопределение массива === будет означать, что обычное равенство не будет совпадением?

# This is ok, because x being 1..3 is a very unlikely event
# But if this behavior occurred with arrays, chaos would ensue?
x = 1..3

case x
  when 1..3 then "match"
  else "no match"
end # => "no match"

1 Ответ

2 голосов
/ 15 ноября 2011

Поскольку это в спецификации .

it "treats a literal array as its own when argument, rather than a list of arguments"

Спецификация была добавлена ​​ 3 февраля 2009 Чарльзом Наттером ( @ headius ).Поскольку этот ответ, вероятно, не то, что вы ищете, почему бы вам не спросить его?

Чтобы сделать дикий и совершенно неосведомленный удар в темноте, мне кажется, что вы, возможно, натолкнулись на ответиспользуя знак в вашем вопросе.Так как функциональность доступна по проекту, почему дублирование при этом лишит возможности проверять равенство массива?Как указывает Джордан , существуют ситуации, когда это полезно.


Будущие читатели должны заметить, что, если рассматриваемый массив уже не создан, использование массива вообще не нужносовпадать по нескольким выражениям:

x = 2

case x
  when 1, 2, 3 then "match"
  else "no match"
end # => "match"
...