6

在读取/解析文件(使用 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"
4

5 回答 5

6

你可以这样做:

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
于 2013-04-13T21:47:35.580 回答
4

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
于 2013-04-13T21:59:45.450 回答
1

使用正则表达式实现紧凑性

您可以用一个使用交替的正则表达式替换大部分当前循环。您可能还想使用String#chomp!作为条件表达式的一部分。例如:

File.open(file).each do |line|
  next if line.chomp! =~ /^$|#|Feature|In order|As a|I want/
  # something else
end

这将您的代码块减少了六行代码。无论您是否发现这种替代方法更易于阅读,它肯定更短且更惯用。你的旅费可能会改变。

于 2013-04-14T05:39:17.870 回答
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?
于 2013-04-13T21:48:52.307 回答
0

使用abstract method重构方法!您可以在抽象方法中使用任何技术,聪明或不那么聪明。

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
于 2013-04-14T05:00:25.733 回答