在读取/解析文件时(使用Ruby)忽略某些行的最佳方法是什么?
我正在尝试从Cucumber .feature文件中解析场景,并希望跳过不以Scenario / Given / When / Then / And / But开头的行。
以下代码有效,但这很荒谬,所以我正在寻找一个智能解决方案:)
File.open(file).each_line do |line|
line.chomp!
next if line.empty?
next if line.include? "#"
next if line.include? "Feature"
next if line.include? "In order"
next if line.include? "As a"
next if line.include? "I want"
答案 0 :(得分:5)
你可以这样做:
a = ["#","Feature","In order","As a","I want"]
File.open(file).each_line do |line|
line.chomp!
next if line.empty? || a.any? { |a| line =~ /#{a}/ }
end
答案 1 :(得分:3)
start_with?
方法接受多个参数:
File.open(file).each_line do |line|
next unless line.start_with? 'Scenario', 'Given', 'When', 'Then', 'And', 'But'
# do something with line.
end
答案 2 :(得分:1)
您可以使用使用交替的单个正则表达式替换当前大部分循环。您可能还希望将String#chomp!用作条件表达式的一部分。例如:
File.open(file).each do |line|
next if line.chomp! =~ /^$|#|Feature|In order|As a|I want/
# something else
end
这可以减少六行代码。无论你是否觉得这种选择更容易阅读,它肯定更短,更具有惯用性。您的里程可能会有所不同。
答案 3 :(得分:0)
这不是那么多帮助,但是,您可以使用数组交集来减少代码。
words = ["#", "Feature", "In order", "As a", "I want"]
File.open(file).each_line do |line|
line.chomp!
next if line.empty? || !(line.split & words).empty?
答案 4 :(得分:0)
使用abstract method
refctoring方法!您可以在抽象方法中使用技术,聪明或不那么聪明的东西。
File.open(file).each_line do |line|
line.chomp!
next if ignore(line)
end
def ignore line
#do whatever you like here, clever or straightforward.
#All the techniques others has posted could be applied here
end