【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
サンプルテキストです。
[]