Это то, что документы должны сказать :
Это позволяет объекту proc быть целью предложения when
в операторе case.
Это, возможно, надуманный пример:
even = proc { |x| x % 2 == 0 }
n = 3
case n
when even
puts "even!"
else
puts "odd!"
end
Это работает, потому что case/when
в основном выполняется так:
if even === n
puts "even!"
else
puts "odd!"
end
case/when
проверяет, какую ветвь выполнять, вызывая ===
в аргументах к when
предложениям, выбирая первое, которое возвращает истинное значение.
Несмотря на его сходство с оператором равенства (==
), оно несильнее или слабее его форма.Я пытаюсь представить оператор ===
оператором «принадлежит».Class
определяет его так, что вы можете проверить, принадлежит ли объект к классу (т.е. является экземпляром класса или подклассом класса), Range
определяет его, чтобы проверить, является ли аргумент принадлежит диапазону (т.е. входит в диапазон) и т. Д.Это на самом деле не имеет смысла в случае Proc
, но думайте о нем как о инструменте для создания собственных операторов , как в моем примере выше;Я определил объект, который может определить, принадлежит ли множество четных чисел.