if response != Net::HTTPNoContent
raise Exception
end
puts "OK"
打印異常,而該代碼
case response
when Net::HTTPNoContent
puts "OK"
else
raise Exception
end
打印 「OK」 到控制檯。我想知道發生了什麼事。 如果您需要更多詳細信息,請告訴我。
if response != Net::HTTPNoContent
raise Exception
end
puts "OK"
打印異常,而該代碼
case response
when Net::HTTPNoContent
puts "OK"
else
raise Exception
end
打印 「OK」 到控制檯。我想知道發生了什麼事。 如果您需要更多詳細信息,請告訴我。
你response
變量是,我認爲,從使用net/http
返回的響應對象。該對象的類型將爲Net::HTTPNoContent
。
在你的第一個變種if
,你正在檢查,看看你的響應對象等於的Net::HTTPNoContent
類。這不會是。 net/http
庫在發送請求時不會返回類,它將返回一個對象,其中包含有關請求的響應的所有信息(類型爲Net::HTTPNoContent
或其他類,具體取決於請求的結果)請求)。
然而,在您的case
變體中,情況會有所不同。 Ruby試圖聰明地處理你給每個when
分支的謂詞。它會對每個分支做一個三重等於(===
)(如#is_a?
,在這個例子中,雖然它做了其他事情)比較,如果有問題的對象的類是(或從後裔)到該分支(或者當然,如果對象確實是等於)。
(在Ruby中,類對象了,這就是爲什麼你可以比較response
類本身,就像你if
版本,它仍然是有意義的解釋。)
所以這是最好的解釋通過重寫你的if
版本:
if !response.is_a?(Net::HTTPNoContent)
raise Exception
end
puts "OK"
噢,謝謝。我有時候對ruby的語法有點困惑。非常感謝你。 –
Ruby除了寫''除非response.is_a?(...)''。 – tadman
簡單的例子:
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
的'case'語句使用''===內部是由''==不同。 – tadman