7
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

[Ruby] gets や ARGV、ARGF、STDIN、$stdin について

Ruby の Kernel#gets や ARGV、ARGF、STDIN、$stdin について

  • ARGV
    • 引数の配列。-- で区切って記述しないと、スクリプトの引数ではなく Ruby の引数と判断される場合がある
  • ARGF
    • ARGV の各引数をファイルパスとみなし、それらのファイルを連結した 1つの仮想ファイルを表すオブジェクト。ARGV が空なら $stdin.gets する。非IO
  • Kernel#gets、Kernel#readline、Kernel#readlines
    • それぞれ ARGF.getsARGF.readlineARGF.readlines と同じ。モジュール関数
  • STDIN
    • 標準入力。読み込みするとユーザー入力を待つ IO オブジェクト。Ctrl-D (EOF シグナル) で打ち切ることができる。
  • $stdin
    • 初期値が STDIN

注意1

  • IO#gets(nil)
    • 行区切りなしですべて読み込む
  • IO#read
    • 同じくすべて読み込む
  • ARGF.gets(nil)
    • 行区切りなしで《1つのファイル》をすべて読み込む
  • ARGF.read
    • 《すべてのファイル》を読み込む

ためす

[Enter]Enter 押下の意味で、実際には表示されない
^DCtrl-D 押下の意味で、実際には表示されない

$stdin のパターン ($stdin != STDIN の場合)

$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.gets; p $stdin.gets '
"foo\n"
"bar\n"
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.gets(nil) '
"foo\nbar\n"
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.read '
"foo\nbar\n"
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.readlines '
["foo\n", "bar\n"]

STDIN のパターン

  • $stdin == STDIN の場合は $stdin を使っても同じ
    • さらに、ARGF.filename == "-" の場合は ARGF を使っても同じ
    • その場合は Kernel を使っても同じ
$ ruby -e ' p STDIN.gets; p STDIN.gets '
foo[Enter]
"foo\n"
bar[Enter]
"bar\n"
$ ruby -e ' p STDIN.gets(nil) '
foo[Enter]
bar[Enter]
^D"foo\nbar\n"
$ ruby -e ' p STDIN.read '
foo[Enter]
bar[Enter]
^D"foo\nbar\n"
$ ruby -e ' p STDIN.readlines '
foo[Enter]
bar[Enter]
^D["foo\n", "bar\n"]

ARGF のパターン (ARGF.filename != "-" の場合)

  • Kernel を使っても同じ
$ echo foo > foobar.txt
$ echo bar >> foobar.txt
$ echo baz > baz.txt
$ ruby -e ' p ARGF.gets; p ARGF.gets ' -- foobar.txt baz.txt
"foo\n"
"bar\n"
$ ruby -e ' p ARGF.gets(nil) ' -- foobar.txt baz.txt
"foo\nbar\n"
$ ruby -e ' p ARGF.read ' -- foobar.txt baz.txt
"foo\nbar\nbaz\n"
$ ruby -e ' p ARGF.readlines ' -- foobar.txt baz.txt
["foo\n", "bar\n", "baz\n"]

ARGV のパターン

$ ruby -e ' p ARGV.shift; p ARGV.shift ' -- foo bar
"foo"
"bar"
$ ruby -e ' p ARGV ' -- foo bar
["foo", "bar"]

注意2

  • Kernel#gets、Kernel#readline、Kernel#readlines はあるが、Kernel#read は存在しない
  • 引数がない場合、ARGF.filename == "-" になるというだけなので、- を引数に渡しても STDIN から読み込む (ruby -e ' p ARGF.read ' -- -)
  • ARGF はすべてのファイルを読み終わっても、勝手に ARGF.filename == "-" になるわけではない

おわり

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
7
Help us understand the problem. What are the problem?