排除目录名称 - ruby

时间:2016-09-08 13:47:13

标签: ruby

我继承了以下内容,可以获取我需要的所有文件夹

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'

我接近过这个错误还是我错过了一些明显的东西?我基本上想要获取不在排除数组

中的所有文件夹名称

由于

1 个答案:

答案 0 :(得分: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。您需要检查整个包含部分是否为假 - 所以将!移动到该表达式的开头。