有没有红宝石的方式来完成这些任务?

时间:2013-05-17 04:36:08

标签: ruby

我正在尝试使用ruby阅读XML格式的Sonar报告。我写了以下代码:

class Resource
    attr_accessor :file_name, :lines, :generated_lines, :ncloc, :generated_ncloc, :statements, :comment_lines, :commented_out_code_lines, :lines_to_cover, :uncovered_lines, :conditions_to_cover, :uncovered_conditions, :line_coverage, :branch_coverage, :coverage, :test_success_density, :test_failures, :skipped_tests, :test_errors, :num_of_tests, :lang, :qualifier

    def to_s
        "#{@name} #{@lines} #{@generated_lines} #{@ncloc} #{@generated_ncloc} #{@statements} #{@comment_lines} #{@commented_out_code_lines} #{@lines_to_cover} #{@uncovered_lines} #{@conditions_to_cover} #{@uncovered_conditions} #{@line_coverage} #{@branch_coverage} #{@coverage} #{@test_success_density} #{@test_failures} #{@skipped_tests} #{@test_errors}#{@num_of_tests} #{@lang} #{@qualifier}"
    end 
end


sonar.root.each_element do |node1| # resources
    next if node1.name != "resources"
    node1.each_element do |node2| #resource
        resource = Resource.new
        resource.lang = node2.text if node2.name == "lang"
        resource.qualifier = node2.text if node2.name == "qualifier"
        resource.name = node.text if node2.name == "name"
    end
end

正如您所看到的,无论我使用if条件语句还是case语句,都会占用太多语句。在ruby中有更简洁的方法吗?

1 个答案:

答案 0 :(得分:1)

首先过滤节点,而不是在迭代时切换。因为你对name属性的每个可能值都做同样的事情,所以也要用循环来干掉。

sonar.root.each_element_with_attribute 'name', 'resources' do |node1|
  %w[lang qualifier name].each do |name_val|
    node1.each_element_with_attribute 'name', name_val do |node2|
      resource = Resource.new
      resource.public_send :"#{name_val}=", node2.text
    end
  end
end

注意:我假设您在代码中使用了REXML,并且在撰写本文时您对我的评论缺乏回答。但是,我会建议您使用更友好的Nokogiri