2016-12-05 8 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ブランチに与えた述語で、Rubyが何をしているのかについて知的にしようとします。問題のクラスのオブジェクトが指定されたクラス(またはそのクラスの子孫)である場合にtrueと評価されるトリプルイコール(===)(この例では#is_a?のように) (もちろん、オブジェクトが実際にはの場合)。

(Rubyでは、クラスがあなたのifバージョンのように、クラス自体へresponseを比較することができ、そしてそれはまだインタプリタに意味をなす理由である、あまりにもオブジェクトである。)

だから、これが最良の説明していますifのバージョンを書き直してください:

+0

ああ、ありがとう。私は時々ルビーの構文と混同している。どうもありがとうございました。 –

+0

レスポンスが無ければRubyは '?(...)'と書いています。 – 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