この記事は何
shellgei160を通じて言語習得 Advent Calendar 2023に参加しています。
書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。
例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160
実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に
answer-ruby
ディレクトリを作り、その中に解答となるファイルを作成していきます。
今回のテーマ
$ while read ln ; do echo $ln ; done < /etc/passwd > ~/a
/etc/passwd
から一行ずつ読み取り、標準入力とファイル(~/a
)への書き込みを同時に行います。
解
lines = File.open('/etc/passwd', 'r').readlines
File.open('a', 'w') do |f|
lines.each do |line|
f.puts line
puts line
end
end
所感
- コードとしての難しさはないが、この処理を行った時のI/Oの効率は気になる。copilotに聞くと、RubyではI/Oは勝手にバッファリングされて効率よく処理されるとのことだが、ユーザー側でそれを把握したり、あるいは明示的に処理を行うにはどうしたら良いだろうか?
- Goで言うところの
TeeWriter
があるともうちょっとしっくりきそう。