高木のブログ

【Ruby】ARGV と gets は併用できない

2022/04/06

普通にやると、ARGV と gets は併用できなかったのでメモ

問題

以下のように ARGV と gets を同時に使おうとしたらエラーを吐いた

app.rb
puts ARGV[0]
puts gets.chomp
$ ruby app.rb hoge
hoge
Traceback (most recent call last):
        2: from app.rb:2:in `<main>'
        1: from app.rb:2:in `gets'
app.rb:2:in `gets': No such file or directory @ rb_sysopen - hoge (Errno::ENOENT)

解決方法

STDIN をつけてあげる

app.rb
puts ARGV[0]
puts STDIN.gets.chomp
$ ruby app.rb hoge
hoge
fuga
fuga

わかりにくいけど、2行目の fuga は標準入力

ARGV の中身を空にするやり方もできる

app.rb
puts ARGV[0]
ARGV.clear
puts gets.chomp

原因

gets は 引数(ARGV)にあるファイルの中身を取得する機能もあるらしい

sample.txt
サンプルテキストです。

引数にファイル名(ファイルパス)をつけて実行すると

$ ruby app.rb sample.txt
sample.txt
サンプルテキストです。

1行目に引数のファイル名、2行目にファイルの中身が出力される

補足情報

gets を使うタイミングと、 ARGV の中身が先頭から取り除かれる

p ARGV
puts ARGV[0]
puts gets.chomp
p ARGV
$ ruby app.rb sample.txt
["sample.txt"]
sample.txt
サンプルテキストです。
[]

参考


ytkg

Written by ytkg, Twitter, GitHub