お題
「たのしいRuby 第6版 P.410」より
回答
(カンニングしてしまった...)
$:.each do |path| next unless FileTest.directory?(path) Dir.open(path) do |dir| dir.each do |name| if name == /\.rb$/i puts name end end end end
説明
ファイルパスが入ってる$:
配列をeachメソッドで回す。ブロック引数にはそれぞれのパスが入る。
unlessはifの反対で、条件式が偽なら実行される。ifは条件式が真なら実行される。 nextは、繰り返しを制御する命令のひとつで、「次の回の繰り返しに処理を移す」という意味。
FileTest.directory?は引数がディレクトリならtrue、ディレクトリじゃないならfalseを返す。ここではディレクトリじゃないものを排除している。 つまり、FileTest.directory?でディレクトリじゃないものはfalseが返るので、それをnextで排除する感じ。
Dir.openにパスを渡し、ディレクトリ内のファイルのファイル名を取得している。
以下の正規表現は、「.rbで終わるファイル」という意味。$は「行末とマッチするパターン」を表す。iはアルファベットの大文字と小文字の違いを無視する。
/\.rb$/i
学び
そもそもライブラリをあまり入れてなかったので結果は表示されなかった。