2016-12-05 43 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變體中,情況會有所不同。 Ruby試圖聰明地處理你給每個when分支的謂詞。它會對每個分支做一個三重等於(===)(如#is_a?,在這個例子中,雖然它做了其他事情)比較,如果有問題的對象的類是(或從後裔)到該分支(或者當然,如果對象確實是等於)。

(在Ruby中,類對象了,這就是爲什麼你可以比較response類本身,就像你if版本,它仍然是有意義的解釋。)

所以這是最好的解釋通過重寫你的if版本:

if !response.is_a?(Net::HTTPNoContent) 
    raise Exception 
end 

puts "OK" 
+0

噢,謝謝。我有時候對ruby的語法有點困惑。非常感謝你。 –

+0

Ruby除了寫''除非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