Self-ответ. Я нашел одно несколько разумное применение до сих пор. Я могу взломать это, чтобы работать в 1.9.2 всего за несколько строк:
describe "Mathematics" do
it "2 + 2 != 5" do
(2+2).should != 5
end
end
До 1.9.2 Ruby это означает:
describe "Mathematics" do
it "2 + 2 != 5" do
((2+2).should == 5) ? false : true
end
end
Но так как возвращаемое значение отбрасывается, у нас нет способов отличить == 5
от != 5
, кроме запроса Ruby для дерева разбора блока. PositiveOperatorMatcher#==(5)
просто вызовет ExpectationNotMetError
исключение, и это будет оно. Кажется, should !~ /pattern/
, should !be_something
и т. Д. Также можно заставить работать.
Это некоторое улучшение по сравнению с (2+2).should_not == 5
, но не очень большое. И нет способа взломать его дальше, чтобы получить такие вещи, как (2+2).should be_even or be_odd
.
Конечно, правильной вещью здесь будет , запрашивающий у Ruby дерево разбора и расширение макроса . Или используя отладочные хуки в интерпретаторе Ruby. Есть ли варианты использования лучше, чем этот?
Кстати, было бы недостаточно разрешить переопределения для !
при переводе !=
/ !~
по-старому. Для !((2+2).should == 5)
для работы #==
не может вызвать исключение до вызова !
. Но если #==
завершится неудачно и !
не получится, выполнение будет просто продолжено. Мы сможем сообщить об утверждении как о неудачном после выхода из блока, но за счет выполнения теста после первого сбоя. (если только мы не включим обработчики ruby debug сразу после неудачного утверждения, чтобы увидеть, будет ли следующий вызов метода !self
или что-то в этом роде)