概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Ruby 2.5 introduces Dir.children and Dir.each_child
- 原文公開日: 2017/11/21
- 著者: Mohit Natoo
- サイト: BigBinaryブログ
Ruby 2.5新メソッド: Dir.children と Dir.each_child(翻訳)
本記事はRuby 2.5シリーズのひとつです。
先ごろRuby 2.5.0-preview1がリリースされました。
Dir.entriesはRuby 2.4にあるメソッドで、シェルコマンドls -a
の結果をarrayで返します。
> Dir.entries("/Users/john/Desktop/test")
=> [".", "..", ".config", "program.rb", "group.txt"]
ls -a
コマンドの結果の各値を列挙してyieldするDir.foreachメソッドもあります。
> Dir.foreach("/Users/john/Desktop/test") { |child| puts child }
.
..
.config
program.rb
group.txt
test2
結果には、カレントディレクトリを表す.
や親ディレクトリを表す..
が含まれています。
子ファイルや子ディレクトリだけにアクセスしたくない場合、arrayの[".", ".."]
の部分は不要です。
これは非常によくあるユースケースであり、欲しい結果を得るためにDir.entries(path) - [".", ".."]
のような方法を使わなければならないでしょう。
この問題を解決するためにRuby 2.5でDir.childrenが導入されました。ls -a
コマンドの出力からカレントディレクトリを表す.
や親ディレクトリを表す..
を除いた結果を返します。
irb> Dir.children("/Users/mohitnatoo/Desktop/test")
=> [".config", "program.rb", "group.txt"]
その他に、列挙中にカレントディレクトリや親ディレクトリのyieldを回避するDir.each_child
メソッドも利用できるようになりました。
irb> Dir.each_child("/Users/mohitnatoo/Desktop/test") { |child| puts child }
.config
program.rb
group.txt
test2
#11302の議論で言及されているように、これらの名前は既存のPathname#children
メソッドやPathname#each_child
メソッドに合わせてあります。
シンプルな機能追加に見えますが、実際は2年以上前にあげられたissueです。