Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby是条件、何时使用实例变量以及通过解析的xml循环而不是存储为散列的效率的简写_Ruby - Fatal编程技术网

ruby是条件、何时使用实例变量以及通过解析的xml循环而不是存储为散列的效率的简写

ruby是条件、何时使用实例变量以及通过解析的xml循环而不是存储为散列的效率的简写,ruby,Ruby,我正在学习ruby,对我为新手挑战编写的一些代码有一些疑问。挑战的目的是从xml文档中找到人口最多的国家 我在下面包含了我的代码。我的问题是: 有没有办法避免初始化@max\u pop变量(@max\u pop=0) 是否有将整个条件块合并为一行的缩写 我是否必须使用实例变量@max\u pop,@max\u pop\u country?没有他们就有错误 哪一个更有效: 在每个国家/地区循环,检查是否pop>max\u pop(以下代码中的方法) 创建pop散列(pop[:country]),然

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

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

  • 有没有办法避免初始化
    @max\u pop
    变量(
    @max\u pop=0
  • 是否有将整个条件块合并为一行的缩写
  • 我是否必须使用实例变量
    @max\u pop
    @max\u pop\u country
    ?没有他们就有错误
  • 哪一个更有效:
  • 在每个国家/地区循环,检查是否
    pop>max\u pop
    (以下代码中的方法)
  • 创建pop散列(
    pop[:country]
    ),然后查找pop最高的国家
  • 是否有哈希方法返回哈希中最大元素的键值对(执行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}
    

    我不熟悉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
    
  • 是的,见上文
  • 是的,见上文
  • 不可以。如果可能,您应该使用局部变量而不是实例变量
  • 在程序运行缓慢之前,不要担心CPU时间的效率。然后使用ruby-prof。在那之前,只需担心编码时间的效率(以简单的方式做事)
  • 是的,只需执行
    key,value=hash.max_by{k,v}

  • 一般来说,如果您打算迭代一些东西,您应该了解Ruby的模块。我为它做了一个参考表。

    如果rexml正确支持枚举数,您可以通过…执行
    doc.elements.each(“cia/country”).max\u,但您应该先尝试上面的代码。
    hash.max
    不会返回max键,而不是值吗?啊,你修好了。哦,是的。我以为我事先测试过了,因为我的测试是错误的。我现在修复了它。给我们看一个XML示例,我们可能会简化它很多。否则,获取一个数组数组,其中包含国家名称和人口,然后使用或来计算它。