重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

require 'open-uri'

file = open('http://www.google.co.jp')
p file.read
というソースコードで、コマンドプロンプトで実行した結果、
C:/samples/samples/09_02/library2.rb:3:in `initialize': Invalid argument @ rb_sysopen - http://www.google.co.jp (Errno::EINVAL)
from C:/samples/samples/09_02/library2.rb:3:in `open'
from C:/samples/samples/09_02/library2.rb:3:in `<main>'
という結果が帰ってくるのですが、なぜでしょうか?教えていただけると幸いです。
の所で、
require 'open-uri'
URI.open('http://www.google.co.jp')



require 'open-uri'
uri = URI.parse('http://www.google.co.jp')
uri.open
のプログラムを書いて、コマンドプロンプトで実行した結果、何も表示されませんでした。
なぜでしょうか?コマンドプロンプトで、HTMLみたいなものがどうすれば実行結果に表示されるのでしょうか?どんなプログラムをコーディングすれば、いいのでしょうか?
教えていただけると幸いです。

質問者からの補足コメント

  • うーん・・・

    では、どんなプログラムをコーディングすれば、コマンドプロンプトにHTMLみたいな内容のものが、
    表示されるのでしょうか?教えていただけると幸いです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2025/03/15 14:49
  • うーん・・・

    迅速な回答ありがとうございます!先ずは、おかえりなさい。
    で、NO.2のプログラムを実行した結果、コマンドプロンプトに何か長ったらしいものが表示されました。ここには、書き切れないくらい長かったです。
    こっちの書籍には、3行くらいの実行結果になっていますが、中略されているのかもしれませんね。で、このプログラムのprintの所は、pか、putsの間違いでは無いですよね?教えていただけると幸いです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2025/03/15 19:11
  • うーん・・・

    tatsumaru77様
    いくつか質問してもよろしいでしょうか?
    このプログラムについてです。
    require 'open-uri'

    file = URI.open('http://www.google.co.jp')
    file.each_line {|line|
    print line
    }
    file.close
    ①fileは、配列ですか?eachメソッドですよね?
    ②_lineはどういう意味があるのでしょうか?
    ③このプログラムの仕組みは、まず、 'open-uri'をインクルードして、そして、変数lineに、fileが代入されて、fileが出力されて、最後にfileを閉じるという事でしょうか?
    ④なぜ、プログラムにfile.closeを入れたのでしょうか?
    これらの質問に答えて頂けると嬉しいです。
    よろしくお願いします!

      補足日時:2025/03/15 19:53
  • うーん・・・

    大変失礼ですが、もう一つ質問があって、NO.2のプログラムを実行した結果、コマンドプロンプトに何か長ったらしいものが表示されました。ここには、書き切れないくらい長かったです。
    こっちの書籍には、3行くらいの実行結果になっていますが、中略されているのかもしれませんね。
    について、教えていただけると幸いです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2025/03/15 21:56
  • うーん・・・

    すみません。プログラムが
    require 'open-uri'
    URI.open("http://www.google.co.jp") {|file|
    file.each_line {|line|
    print line
    }
    }
    から、
    require 'open-uri'

    file = URI.open('http://www.google.co.jp')
    file.each_line {|line|
    print line
    }
    file.close
    にプログラムが置き換わっているのですが、file.closeが無いだけならまだ分かるのですが。
    教えていただけると幸いです。

    No.4の回答に寄せられた補足コメントです。 補足日時:2025/03/15 23:17
  • require 'open-uri'

    URI.open("http://www.google.co.jp") {|file|
    file.each_line {|line|
    print line
    }
    }
    が、なぜ例: File.open による書き込みモードでのファイルオープン
    File.open("testfile", "w", 0755) { |f| f.print "test" }
    に該当するのでしょうか?それと、URIの所は、fileに置き換えているのでしょうか?教えて頂けると幸いです!

    No.5の回答に寄せられた補足コメントです。 補足日時:2025/03/16 13:28
  • うーん・・・

    迅速な回答ありがとうございます!所で、方式1も方式2もそういう書き方をするという風に覚えればよいのでしょうか?なぜ方式1にはcloseがあるのも、そういうものだと覚えれば良いのでしょうか?
    教えていただけると幸いです。

    No.6の回答に寄せられた補足コメントです。 補足日時:2025/03/16 14:41

A 回答 (7件)

>方式1も方式2もそういう書き方をするという風に覚えればよいのでしょうか?



はい、そのように覚えてください。

>なぜ方式1にはcloseがあるのも、そういうものだと覚えれば良いのでしょうか?

はい、そのように覚えてください。
    • good
    • 0
この回答へのお礼

迅速な回答ありがとうございました!今後ともよろしくお願いします!

お礼日時:2025/03/16 15:18

すみません。

No5の説明は無視してください。

URI.openは、以下の何れかの書き方ができます。

方式1
file = URI.open(・・・)
・・・fileに関する処理・・・
file.close


方式2
URI.open(・・・) { |file|
・・・fileに関する処理・・・
}

方式2の場合は、closeの処理がかかれていませんが、
・・・fileに関する処理・・・ が終わると自動的にrubyがcloseを行ってくれます。


上記を踏まえて、
方式1は
require 'open-uri'
file = URI.open('http://www.google.co.jp')
file.each_line {|line|
print line
}
file.close


方式2は
require 'open-uri'
URI.open("http://www.google.co.jp") {|file|
file.each_line {|line|
print line
}
}

になります。
どちらも、同じ結果になります。
この回答への補足あり
    • good
    • 0

require 'open-uri'


URI.open("http://www.google.co.jp") {|file|
file.each_line {|line|
print line
}
}

は、open時にブロックを指定する方法です。
https://docs.ruby-lang.org/ja/latest/method/File …

例: File.open による書き込みモードでのファイルオープン
File.open("testfile", "w", 0755) { |f| f.print "test" }

に該当します。

この方法を使用すると、closeを記述する必要がありません。
このような書き方もあるということを覚えておけば良いかと思います。
この回答への補足あり
    • good
    • 0
この回答へのお礼

No.5です。
迅速な回答ありがとうございます。

お礼日時:2025/03/16 13:30

>大変失礼ですが、もう一つ質問があって、NO.2のプログラムを実行した結果、コマンドプロンプトに何か長ったらしいものが表示されました。

ここには、書き切れないくらい長かったです。

こちらで実行した結果もかなりの量が表示されます。
その書籍では、省略されていると思われます。

ちなみに
file = URI.open('http://www.google.co.jp')

file = URI.open('http://www.ruby-lang.org/')
に変えて実行すると、少量の以下のメッセージになります。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ruby Programming Language</title>
<script type="text/javascript">
var languages = {
"de": "de",
"es": "es",
"id": "id",
"ja": "ja",
"ko": "ko",
"pt": "pt",
"ru": "ru",
"tr": "tr",
"zh-CN": "zh_cn",
"zh-TW": "zh_tw"
};

var code = window.navigator.language || window.navigator.userLanguage || "en";
if (code.substr(0,2) !== "zh") { code = code.substr(0,2); }

var language = languages[code];
if (!language) { language = "en"; }

document.location = "/" + language + "/";
</script>
<noscript>
<meta http-equiv="refresh" content="0; url=/en/">
</noscript>
</head>
<body>
<p><a href="/en/">Click here</a> to be redirected.</p>
</body>
</html>
この回答への補足あり
    • good
    • 0
この回答へのお礼

迅速な回答ありがとうございます!実行結果は、tatsumaru77様と同じになりました。

お礼日時:2025/03/15 23:09

>①fileは、配列ですか?eachメソッドですよね?



fileは、StringIO クラスのオブジェクトです。(Tempfile の場合もあり)
https://docs.ruby-lang.org/ja/latest/library/ope …

StringIOクラスは、「文字列に IO と同じインタフェースを持たせるためのクラスです。」
https://docs.ruby-lang.org/ja/latest/class/Strin …

IOクラスは、基本的な入出力機能のためのクラスです。
https://docs.ruby-lang.org/ja/latest/class/IO.html

IOクラスは、openによって返されるインスタンスです。

このクラスでは、IO#each_lineがサポートされています。
これは、1行ずつ読み込んだ結果を処理してくれます。
file.each_line {|line|
print line
}
では、1行読み込んだ結果をlineに設定し、{}の中を実行します。
つまり、1行ずつ読み込んだ結果を印字しています。



>②_lineはどういう意味があるのでしょうか?

_lineではなく、each_lineのことですか?
each_lineは1行ずつ読み込んだ結果を処理するためのメソッドです。


>③このプログラムの仕組みは、まず、 'open-uri'をインクルードして、
>そして、変数lineに、fileが代入されて、fileが出力されて、最後にfileを閉じるという事でしょうか?


以下のようなことを行ってます。
(1)まず、 'open-uri'をインクルードして、
(2)URL 'http://www.google.co.jp' オープンして、その結果をfileに格納します。
  fileはStringIOクラスのオブジェクトです。
(3)fileを1行ずつ読み込んで、その結果をlineに設定します。
(4)そのlineの内容を画面に印字します。
(5)最後にfileをクローズします。


>④なぜ、プログラムにfile.closeを入れたのでしょうか?

通常は、オープンしたファイルは最後にクローズするので、その慣習にならってクローズしています。
尚、以下のように書いた場合は、ruby側で自動的にクローズしてくれるので、file.closeを記述する必要は
ありません。

require 'open-uri'
URI.open("http://www.google.co.jp") {|file|
file.each_line {|line|
print line
}
}
この回答への補足あり
    • good
    • 0
この回答へのお礼

No.3です。
迅速な回答ありがとうございます!

お礼日時:2025/03/15 21:58

オープンしただけでは、URIの内容は表示されません。


それを読み込んで、読み込んだ内容を印字する必要があります。

>コマンドプロンプトで、HTMLみたいなものがどうすれば実行結果に表示されるのでしょうか?

以下のようにしてください。


require 'open-uri'

file = URI.open('http://www.google.co.jp')
file.each_line {|line|
print line
}
file.close
この回答への補足あり
    • good
    • 0
この回答へのお礼

で、このプログラムのprintの所は、pか、putsの間違いでは無いですよね?教えていただけると幸いです。
すみません。これについては、撤回します。大変失礼しました。

お礼日時:2025/03/15 19:15

そういうプログラムを書いているからです。

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A