Tech Racho エンジニアの「?」を「!」に。
  • 開発

Ruby 2.5新メソッド: Dir.children と Dir.each_child(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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です。

関連記事

Ruby 2.5のパフォーマンス改善点(翻訳)

Ruby: ぼっち演算子`&.`の落とし穴(翻訳)

【保存版】Rubyスタイルガイド(日本語・解説付き)総もくじ

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。