Как найти, если префикс соответствует какой-либо строке в наборе в Ruby? - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь пройти предопределенный набор пути dir, но у меня есть только префикс пути

Я пробовал использовать include?или найти метод, который делает это.Я могу думать только о тривиальном решении определить регулярное выражение и перейти к каждому в наборе, но это, кажется, не такой уж стиль в стиле ruby ​​

require 'set'

legal_paths = Set['A/B/C', 'A/D/E', 'A/F/G']
Dir.glob('**/system.log').each do |fd|
    if failed_tests_path.include?(fd) #fd for example = A/F/G/E/system.log, A/B/C/K/system.log etc...
        puts fd
    end
end

Я хочу, чтобы fd был только файлами system.logчто пути включены в набор (набор содержит префикс к пути)

1 Ответ

2 голосов
/ 21 апреля 2019

Если это только префикс, попробуйте String#start_with?:

require 'set'

legal_paths = Set['A/B/C', 'A/D/E', 'A/F/G']
files = Dir.glob('**/system.log').select do |fd|
  fd.start_with?(*legal_paths)
end

Почему бы не использовать тот факт, что вы можете указать эти префиксы в глобусе?

legal_paths = ['A/B/C', 'A/D/E', 'A/F/G']
files = Dir.glob("{#{legal_paths.join(',')}}/**/system.log")

Обратите внимание, что если пользователь вводит legal_paths, вышеприведенное может быть небезопасным, поскольку пользователь может перейти к родительским каталогам, используя ...

...