0

我正在学习 ruby​​,并且对我为新手挑战编写的一些代码有一些疑问。挑战的目的是从 xml 文档中找到人口最多的国家。

我在下面包含了我的代码。我的问题是:

  1. 有没有办法避免初始化@max_pop变量(@max_pop=0)?
  2. 是否有将整个条件块组合成 1 行的简写?
  3. 我必须使用实例变量@max_pop@max_pop_country?没有他们就会出错。
  4. 哪个更有效:
    1. 遍历每个国家并检查是否pop > max_pop(以下代码中的方法)
    2. 创建pop hash ( pop[:country]),然后找到pop 最高的国家
  5. 是否有散列方法返回散列中最大元素的键值对(做 4.1)?

源代码:

@max_pop=0
doc.elements.each("cia/country") do |country|
 if country.attributes["population"].to_i > @max_pop
  @max_pop=country.attributes["population"].to_i
  @max_pop_country=country.attributes["name"]
 end
end 
puts "country with largest pop is #{@max_pop_country} with pop of #{@max_pop}
4

1 回答 1

1

我不熟悉 rexml,但您应该能够将所有内容简化为以下内容:

max_pop_elem = doc.elements.enum_for(:each, "cia/country").max_by { |c| c.attributes["population"].to_i }
max_pop_country = max_pop_elem.attributes["name"]
max_pop = max_pop_elem.attributes["population"].to_i
  1. 是的,见上文。
  2. 是的,见上文。
  3. 不,您应该尽可能使用局部变量而不是实例变量。
  4. 在你有一个缓慢的程序之前,不要担心 CPU 时间的效率。然后使用 ruby​​-prof。在那之前,只需要担心编码时间的效率(做事简单)。
  5. 是的,只是做key, value = hash.max_by{|k,v| v}

一般来说,如果你要迭代一些东西,你应该了解 Ruby 的Enumerable模块。我在这里为它做了一个参考表。

于 2012-08-14T17:18:02.647 回答