对不起,我是Ruby的新手(只是一个Java程序员),我有两个字符串数组:
我需要检查每个"文件路径"上的每个模式。我这样做:
@flag = false
["aa/bb/cc/file1.txt","aa/bb/cc/file2.txt","aa/bb/dd/file3.txt"].each do |source|
["bb/cc/","zz/xx/ee"].each do |to_check|
if source.include?(to_check)
@flag = true
end
end
end
puts @flag
此代码没问题,打印" true "因为" bb / cc"在源头。
我看过几个帖子但找不到更好的方法。我确信应该有一些功能允许我用更少的行来完成这项工作。 这有可能吗?
答案 0 :(得分:4)
如@dodecaphonic所述,使用Enumerable#any?
。像这样:
paths.any? { |s| patterns.any? { |p| s[p] } }
其中paths
和patterns
是OP定义的数组。
答案 1 :(得分:1)
虽然这样可行,但这会产生几何缩放问题,即必须对N个文件列表进行N * M测试,而不是M模式。您可以稍微优化一下:
files = ["aa/bb/cc/file1.txt","aa/bb/cc/file2.txt","aa/bb/dd/file3.txt"]
# Create a pattern that matches all desired substrings
pattern = Regexp.union(["bb/cc/","zz/xx/ee"])
# Test until one of them hits, returns true if any matches, false otherwise
files.any? do |file|
file.match(pattern)
end
如果需要,可以将其包装在方法中。请记住,如果模式列表没有更改,您可能需要创建一次并保留它而不是不断地重新生成它。