2016-09-08 7 views
0

私は私が除くディレクトリ名 - ルビー

folders = Dir.entries('features/tmp').select { |entry| File.directory? File.join('features/tmp', entry) and !(entry == '.' || entry == '..' || entry == '.git' || entry == 'step_definitions') } 

を必要とするすべてのフォルダを取得し、以下を継承してきた。しかし、私はそれをクリーンアップするために、これをリファクタリングすると、私が今まで望んでいた場合は簡単に何かを追加するために探しています将来の任意のフォルダを除外ではなく、クエリ

を連鎖するだから私はこのが出ているが、

# Dir.entries('features/tmp').select { |entry| p entry } 
# [".", "..", ".git", "idv4", "step_definitions"] 

exclude = %w(. .. .git step_definitions) 
Dir.entries('features/tmp').select { |entry| File.directory? File.join('features/tmp', exclude.include?(!entry))} 

TypeError: no implicit conversion of false into String 
from (pry):26:in `join' 

次のエラーを取得する私はこのWROに近づいあり何か明白なものがないのですか?演算の順序に注意してください - 私は基本的に除外し、アレイにあなたが少し混ざった条件を持っていた

おかげ

+0

多分、私は '!entry'のためにしています。あなたは 'String'を否定しています。 – lcguida

答えて

2

ないすべてのフォルダ名を取得したいです。私はそれをもっと明確にするために、かっこをFile.directory?コールに付け加えました。

exclude = %w(. .. .git step_definitions) 
Dir.entries('features/tmp').select { |entry| 
    File.directory?(File.join('features/tmp', entry)) && \ 
    !exclude.include?(entry) 
} 
  1. File.joinだけで、システムのパス区切りを使用して複数の文字列を結合します。だから親ディレクトリ名をブール値(exclude.include(!entry))にすることは、あなたがしたいことではなく、そのファイルがディレクトリであるかどうかを確認することです - したがって、結合は以前と同じままでなければなりません。
  2. exclude.include(!entry)あなたが文字列を否定しようとしているからです。 !'string' == false。包含部分全体が偽であるかどうかを確認する必要があります。!をその式の先頭に移動します。
+0

ああありがとう、私は今それを見ることができます:-)大きな助け – Richlewis

+0

何が起こっているのかのより良い説明を追加しました: – casraf

+0

はい、それはさらに助けになりました – Richlewis

関連する問題