2016-12-05 1 views
0

Этот кодразница между ними, если и так - рубин

if response != Net::HTTPNoContent 
    raise Exception 
end 
puts "OK" 

печатает исключение, в то время как этот код

case response 
when Net::HTTPNoContent 
    puts "OK" 
else 
    raise Exception 
end 

печатает "OK" на пульте. Я хотел бы знать, что происходит. Если вам нужна дополнительная информация, дайте мне знать.

+0

Параметр 'case' оператор использует' '=== внутренне который отличается от' '==. – tadman

ответ

2

Вашего 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" 
+0

О, спасибо. Иногда я немного смущен синтаксисом Ruby. Большое спасибо. –

+0

Это больше Ruby, чтобы написать 'if response.is_a? (...)'. – tadman

0

Простой пример:

a = 'a' 
if a != String 
    p '-' 
else 
    p '+' 
end 

case a 
when String 
    p '+' 
else 
    p '-' 
end 

Возврат:

#=> - 
#=> + 

Это означает, что в первом примере вы пытаетесь проверить, если значение некоторой реакции равно классу. При использовании case when String было бы проверить if a.is_a? String

Смежные вопросы