0

私はルビーを学んでいて、初心者の挑戦のために書いたコードについていくつか質問があります。課題の目的は、xml ドキュメントから人口が最も多い国を見つけることです。

以下に私のコードを含めました。私が持っている質問は次のとおりです。

  1. @max_pop変数 ( )を初期化する必要を回避する方法はあり@max_pop=0ますか?
  2. 条件付きブロック全体を 1 行にまとめる省略形はありますか?
  3. インスタンス vars を使用する必要があります@max_pop@max_pop_country? それらなしでエラーが発生しました。
  4. どちらがより効率的ですか:
    1. 各国をループして確認するpop > max_pop(以下のコードでのアプローチ)
    2. ポップ ハッシュ ( pop[:country]) を作成し、ポップが最も高い国を見つけます
  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 に答える