Вашего response
переменное, я полагаю, объект ответа вернулся с помощью net/http
. Этот объект типа будет Net::HTTPNoContent
.
В своем первом if
варианты, вы проверяете, чтобы увидеть, если ваш объект ответа равен Net::HTTPNoContent
класса. Этого не будет. Библиотека net/http
не собирается возвращать класс при отправке вашего запроса, она вернет объект, содержащий всю информацию о ответе вашего запроса (и будет иметь тип Net::HTTPNoContent
или какой-либо другой класс в зависимости от результата запрос).
В вашем варианте case
, однако, все работает по-другому. Рубин пытается быть умным о том, что он делает с предикатами, которые вы даете каждой ветке when
. Он будет делать тройное равенство (===
) (например, #is_a?
, в этом примере, хотя он и делает другие вещи) сравнение с каждой ветвью, которая оценивает значение true, если класс объекта, о котором идет речь, является (или спускается с) классом, указанным в ветвь (или, конечно, если объект равен действительно равен).
(В Ruby, классы объектов тоже, поэтому вы можете сравнить response
к самому классу, как и в версии if
, и она все еще имеет смысл для интерпретатора.)
Так что лучше всего объяснить переписав свою версию if
:
if !response.is_a?(Net::HTTPNoContent)
raise Exception
end
puts "OK"
Параметр 'case' оператор использует' '=== внутренне который отличается от' '==. – tadman