Rubyの演算子「===」についての質問

このQ&Aのポイント
  • Rubyの演算子「===」についての質問です。Rubyのリファレンスから抜粋した例を用いて、条件分岐のcase文とif文での動作の違いについて説明しています。
  • Rubyの演算子「===」についての質問です。HTTPリダイレクトが発生したときの条件分岐をcase文とif文で記述し、その挙動の違いについて疑問を持っています。
  • 初めてのRuby学習の初日から、演算子「===」に関する質問です。リファレンスからの抜粋コードを用いて、条件分岐の方法の違いについて疑問を抱いています。
回答を見る
  • ベストアンサー

Ruby 演算子 "==="

Rubyの演算子 "===" についての質問です。 例:Rubyリファレンスより抜粋 require 'uri' require 'net/http' Net::HTTP.version_1_2 # おまじない def fetch( uri_str, limit = 10 ) # 適切な例外クラスに変えるべき raise ArgumentError, 'http redirect too deep' if limit == 0 response = Net::HTTP.get_response(URI.parse(uri_str)) case response when Net::HTTPSuccess then response when Net::HTTPRedirection then fetch(response['location'], limit - 1) else response.error! end end HTTPRedirectionが起きたと仮定して。 この case文だと思った通りの動きをします。 しかし、case文の部分を if response == Net::HTTPRedirection としたところ if文の中に入ってきません。何故でしょう? if response === Net::HTTPRedirection としても同じ結果でした。 Rubyを勉強しはじめて 初日からこんな調子ですが 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>Ruby で言う self は、Java で言う this 何でしょうか? えーと、そうだと思う。 って答えるほど、JavaもRubyもよく知っちゃいないんですが。 あー、リファレンスに「self というのは何ですか」ってのが あるね。13番目↓

参考URL:
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=FAQ%3A%3A%A5%AF%A5%E9%A5%B9%A1%A2%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB
maruchan0488
質問者

お礼

情報ありがとうございます。 リンク先を見てみたら まさにそのままのリファレンスがありました。。。ごめんなさい

その他の回答 (1)

回答No.1

逆かも。 if Net::HTTPRedirection === response リファレンスの self === obj の項及び リンクされてる Object#kind_of? の項参照のこと。

参考URL:
http://66.102.11.104/search?q=cache:V5yvUDKblNUJ:kansai.anesth.or.jp/gijutu/ruby/man-z1/refm0045.html+ruby+case+%E3%82%A
maruchan0488
質問者

お礼

アドバイスありがとうございます。 if Net::HTTPRedirection === response で問題なく動きました♪ リンク先も見させてもらいました。 っで Ruby で言う self は、Java で言う this 何でしょうか? なんか違うきもするのですが Ruby がオブジェクト指向的にも構造化風にも書けるのは self が裏で仕事をしているからと書いているサイトもありました。 self って何物なんでしょうか? 追加質問になってしまいましたが 時間が空いた時にでも 答えてくれると嬉しいです。

関連するQ&A

  • Ruby net/httpについて

    Rubyで#!/ruby/bin/ruby require 'net/http' require 'uri' print "content-type: text/html\r\n\r\n"; begin url = "http://~~~.com/" Net::HTTP.get_print URI.parse(url) rescue => ex print ex.class; print "<hr />"; print ex.message; print "<hr />"; print ex.backtrace; end というようなコードで指定のURLの内容をgetしたいと思っています。 が、とりあえずは上記内容でURL先の内容は取得できるのですが url = "http://www.~~~.com"; という風にwwwをつけるとスクリプトがうごかずURL先の内容が取得できないのです。 原因はなんなのでしょうか? 識者のかたご教授ください。

    • ベストアンサー
    • Ruby
  • Ruby:net/httpライブラリで質問です。

    RubyでWEBAPIをたたこうとおもい リファレンスから require 'net/http' Net::HTTP.version_1_2 # おまじない Net::HTTP.start('www.example.com', 80) {|http| response = http.get('/index.html') puts response.body } という記述を利用してヤフーのページを取得しようと 動かしたところまったく動作しなかったのでだめもとで例外をとってみたら begin Net::HTTP.version_1_2() # おまじない Net::HTTP.start("http://yahoo.co.jp", 80) {|http| response = http.get("/index.html"); puts response.body } rescue => ex print ex.class; print "<hr />"; print ex.message; print "<hr />"; print ex.backtrace; end SocketErrorgetaddrinfo: 記憶域制御ブロックが壊れています。 C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `initialize'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `open'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/timeout.rb:53:in `timeout'C:/ruby/lib/ruby/1.8/timeout.rb:101:in `timeout'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:553:in `do_start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:542:in `start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:440:in `start'C:/Apache/htdocs/tokui12.rb:11 上記のような例外が取れました。 これは、Rubyの際インストールが必要なのでしょうか? リファレンスまんまを利用しているので記述間違いとかはないと思うのですが・・・ システム的な問題?と思いPHPでたたいたところ PHPであれば普通にAPIはたたけました。 対処策はどうしたらいいのでしょうか?

    • ベストアンサー
    • Ruby
  • Rubyでwebページを取得するとき

    Rubyでwebページを取得してtxtファイルに出力したいと考えています。 URLリストを別ファイルで用意して、それを片っ端から読み込んで表示させるものです。 require 'open-uri' require 'kconv' while url=gets next if url=="\n" page=URI(url).read page=Kconv.tosjis(page) puts(page) end これで成功するのですが、「URLリストにのっているwebページが見つからなかったら飛ばして次のページを取得しにいく」ことを追加したいです。 どう書けばいいでしょうか? 教えていただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • rubyに関する質問です。

    rubyに関する質問です。 require 'open-uri' open("uri") do |f| 5.times do print f.gets end end これを実行すると <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>繧ェ繝悶ず繧ァ繧ッ繝域欠蜷代せ繧ッ繝ェ繝励ヨ險?隱・Ruby</title> Complete(0) このように日本語のところだけ文字化けしてしまうのですが、どのようにすれば文字化けがなおるのでしょうか?

    • ベストアンサー
    • Ruby
  • Rubyでの正規表現

    Rubyにおいて、下のようなプログラムを組んだのですが、 エラーが出ます。"{"や"+"が予約語(?)なのが問題なのだと思いますが、 どのようにして回避すればよいのでしょうか?? str = "{N1+N2}+N3" reg = "{N1+N2}" if str =~ /#{reg}/ p "ok" end

  • Ruby Net::HTTP 自作DL関数 初心者

    Ruby初心者です。 先日ダウンロード関数を作ったのですが、(下記) この関数に、既存の機能を外さず、リフェラーと、ユーザーエージェントを設定できるようにしたいのですが、 どこをどう変更したらよいかわかりません。 わかる方、ご指導ください。 初心者的コードですがどうかご勘弁ください。 =========== # インターネットからファイルをダウンロードする ※badNoFnameFlag => デフォルトのファイル名が指定されていない場合は、失敗とみなす def try_download(uri,num_trial = 3,badNoFnameFlag = false,minimum_content_length = 0) retHash = {} num_trial.times{ res = Net::HTTP.get_response(URI.parse(uri)) # , 'User-Agent' => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" & リフェラー を設定したい if res.class.name != "Net::HTTPOK" || res.code != "200" || res.message != "OK" next else fname = cd_file(res['content-disposition']) if badNoFnameFlag if !fname next end end if !defined? res['content-length'] next end if is_numeric(res['content-length']) res['content-length'] = numeric_or_zero(res['content-length']) else next end if Float(res['content-length']) <= minimum_content_length next end if !fname retHash['name'] = basename(uri) else retHash['name'] = fname end retHash['body'] = res.body break end } return retHash end ===========

    • ベストアンサー
    • Ruby
  • rubyのプログラムについて

    rubyのプログラムで2~1000までの素数を列挙のものなんですがどこか違ってますか汗 考えたんですがよくわからなくて汗すみませんどなたかお願いします i=2 print "素数は\n" while i<=1000 do warukazu=2 flag=0 while warukazu<i do if i%warukazu==0 then flag=flag+1 warukazu=warukazu+1 else warukazu=warukazu+1 end end if (flag==0) then print i print"\n" end i=i+1 end

  • Like演算子で、[と]を文字として扱い比較したい

    今、フォルダ内のファイルリストを作成するVBA(Excel2003)を作っています。そこで、ファイル(絶対パス:フルパス)に「含まれていい文字」と「含まれない文字」(キーワード)を指定できる機能を作っています。 以前、VB6で類似の機能を作った時は、すんなり行ったのですが、VBAではうまくいきません。正規表現が使えるに越したことはないのですが、「 [ や ] を文字として認識するだけでもいいです。」 リストを作るフォルダには、  [20].txt  テキスト[a]txt  メモ[10] - コピー.txt などのテストファイルとその他ファイルが存在します。 キーワードを指定しないときには、うまく行きます。 指定すると、たとえば [10].txt というファイルがヒットしないように、NGワードを [10] を指定すると、[20].txtまでヒットしません。[a]では全てがヒットしません。 また、OKワードに[10]を指定すると[10]と[20]がヒットします。 ===== NGワードを比較している部分 ==== 引数:in_str が NGワード(スペースで区切って複数指定可能) 引数:target_Str がフルパス Public Function keywords_NG(in_Str As String, target_Str As String) As Boolean   If in_Str = "" Then     keywords_NG = True     Exit Function   End If      Dim wordArray() As String   Erase wordArray()   wordArray() = Split(in_Str, Space(1))     Dim tempFLG As Boolean   tempFLG = True      Dim wordIDX As Long   For wordIDX = 0 To UBound(wordArray) Step 1     If wordArray(wordIDX) <> "" And target_Str <> "" Then       If target_Str Like "*" & wordArray(wordIDX) & "*" = True Then         tempFLG = False       End If     End If   Next   If tempFLG = True Then     keywords_NG = True   Else     keywords_NG = False   End If End Function ===== OKワードを比較している部分 ==== 引数:in_Str が OKワード(スペースで区切って複数指定可能) 引数:target_Str がフルパス Public Function keywords_OK(in_Str As String, target_Str As String) As Boolean   If in_Str = "" Then     keywords_OK = True     Exit Function   End If   Dim wordArray() As String   Erase wordArray()   wordArray() = Split(in_Str, Space(1))      Dim tempFLG As Boolean   tempFLG = False      Dim wordIDX As Long   For wordIDX = 0 To UBound(wordArray) Step 1     If wordArray(wordIDX) <> "" And target_Str <> "" Then       If target_Str Like "*" & wordArray(wordIDX) & "*" = True Then         tempFLG = True       End If     End If   Next      If tempFLG = True Then     keywords_OK = True   Else     keywords_OK = False   End If    End Function ===== [や]を区切り文字ではなくする関数 ==== Public Function keywords_escape_sequence(keywordStr As String) As String      If keywordStr = "" Then     keywords_escape_sequence = ""     Exit Function   End If      Dim myIDX As Currency   Dim str_X As String      str_X = ""        For myIDX = 1 To Len(keywordStr) Step 1     If Mid(keywordStr, myIDX, 1) = "[" Then       str_X = str_X & "[[]"     ElseIf Mid(keywordStr, myIDX, 1) = "]" Then       str_X = str_X & "[]]"     Else       str_X = str_X & Mid(keywordStr, myIDX, 1)     End If   Next      keywords_escape_sequence = str_X End Function =====================================================     If keywords_OK(keywords_OK_Str, フルパス)) = True And _       keywords_NG(keywords_NG_Str, フルパス)) = True Then         'ファイルリスト作成     end if ===================================================== 正規表現を使うためには…というページを見つけ参照設定に以下の項目にチェックを入れてみましたが、結果は変わらす □Microsoft VBScript Regular Expressions 5.5 ===== RegExp と CreateObject ==== 参照設定をできれば変更したくない場合は、RegExp と CreateObject を使えば良いとあるページに書いてありましたが、参照設定でもできなかったので、これだけは試してません。 ヒントだけでもお教えください。

  • Rubyでnet::httpを用いてPOSTする

    今晩わ。 RubyでNet::HTTPをもちいてPOST送信する際の処理について 質問です。 Net::HTTPクラスのインスタンスメソッドのpostメソッドを用いて送信する場合 送信内容を # version 1.2 (Ruby 1.8.x or later) response = http.post('/cgi-bin/search.rb', 'query=subject&target=ruby') 上記のように、引数に渡していると思います。 このとき、値の中にパラメータのデリミタと同じ&を入れたい場合どうしたらいいのでしょうか? 例えば query=subject&target=ruby&PHP のような感じでvalueとして&を渡す場合です。 Net**HTTP::Postクラスのrequestメソッドを用いてハッシュとして渡した時は問題なかったのですが、上記のpostメソッドの時がPOSTされた値を取得するときにキチンと取得できませんでした。これはなにか対処方法があるのでしょうか? ご教授ください。 おねがいします。

    • ベストアンサー
    • Ruby
  • rubyの構文(&&を用いた条件分岐について)

    ruby初心者です。 最近、ruby on railsで書かれたソースを引き継ぎ解析を行っています。 その中で、以下のような構文が出てきました。 ========================================= num = 0 bool = false vals = '' puts 'start' num == 0 && bool && if vals  puts 'true' else  puts 'false' end puts 'end' ========================================= 上記プログラムを実行すると、if ~ end までが実行されませんでした。 そこで、変数boolをtrueに変更して再実行したところ、if文が実行されました。 そこで私は、上記プログラムは以下と同値であると解釈しました。 ====================================== (省略) if num == 0 && bool  if vals   puts 'true'  else   puts 'false'  end end ======================================= 以上を踏まえて・・・ 1.私の解釈は正しいでしょうか? 2.間違っている場合、正しい処理の解釈を教えていただけますでしょうか?または参考URLを教えていただけますと助かります。 文の最後に"&&"がついている文を見たことがなく、ネットで調べても 正解らしいものが掲載されていなかったので質問させていただきました。 拙い説明で申し訳ありませんが、よろしくお願いいたします。

    • ベストアンサー
    • Ruby

専門家に質問してみよう