0

式の評価方法に基づいて、2 つの可能なファイルのいずれかに 'if' ステートメントを書き込む "Ruby Way" とは何ですか?

Perl では、ハッシュ内のキーをチェックする配列をループするために、次のようなことを行います。出力は、必要に応じて「existing-keys.txt」または「missing-keys.txt」に書き込まれます。

giant_hash = { 'k1' => 'v1', 'k2' => 'v2', 'k3' => 'v3' }
check_array = ['k1', 'k3', 'k4']

f1 = File.open('existing-keys.txt', 'w')
f2 = File.open('missing-keys.txt', 'w')

check_array.each do |check_key|
    if giant_hash.has_key?(check_key)
        f1.puts check_key
    else 
        f2.puts check_key
    end
end

f1.close
f2.close

それはうまくいきますが、私はRubyに慣れていないので、Rubyに似た方法で物事を行う方法がたくさんあることに何度も遭遇しました。複数のファイルを書き込む Ruby の方法はありますか?

4

2 に答える 2

4

2 回繰り返してもパフォーマンスのオーバーヘッドが大きくない場合 (ほとんどの場合、そうではありません)、2 回実行できます。最も簡単な方法は次のとおりです。

File.open('existing-keys.txt','w') do |f|
  f.puts check_array.select { |k| giant_hash.has_key? k }
end

File.open('missing-keys.txt','w') do |f|
  f.puts check_array.reject { |k| giant_hash.has_key? k }
end

または、使用することもできます(これが最良の方法だと思います)

existing, missing = check_array.partition { |k| giant_hash.has_key? k }

File.open('existing-keys.txt','w') { |f| f.puts existing }
File.open('missing-keys.txt','w') { |f| f.puts missing }

これは少しクリーンで表現力があり、おそらく check_array を 2 回実行する際のオーバーヘッドの一部が取り除かれます。

1.9.3 以降を使用している場合は、使用できますFile.write

File.write('existing-keys.txt',existing * "\n")
File.write('missing-keys.txt',missing * "\n")

しかし、私はそれが必要だとは思いません/慣用的です。まだオプションです。

于 2013-07-07T23:41:12.000 に答える
0

基本的に同じです。Ruby の if ステートメントが実際に値を返すという事実を利用できると思いますが、読みにくくなる可能性があります。三項を使うこともできます (Perl でも可能です):

check_array.each do |check_key|
  (giant_hash.has_key?(check_key) ? f1 : f2).puts check_key
end

ちなみにRubyのインデントは必ずスペース2つ。これはRuby では他の言語よりもはるかに強力な規則なので、それに従ってください。

于 2013-07-07T23:27:24.903 に答える