2012-01-10 27 views
0

このコードをコンパクトにすることはできますか?このコードをさらに圧縮するにはどうすればよいですか?

db_tables_scanned = {} 
IO.readlines(resume_log_file).each { |db_table| db_tables_scanned[db_table.split(".")[0].strip] << db_table.split(".")[1].strip if db_table.include? '.' } if resume and File.exists?(resume_log_file) 
+0

短い変数名を使用することにより。 – Thilo

+0

変数名は自明でなければなりませんか? –

答えて

3

ワンライナーが欲しいですか?ここには1つのライナーがあります:

db_tables_scanned = resume and File.exists?(resume_log_file) ? Hash[IO.readlines(resume_log_file).map { |db_table| db_table.split(".").map(&:strip) if db_table.include? '.' }.compact] : {} 

もちろんこのコードはひどいです。より少ないコード行を得ることに夢中になる必要はありません。コードは、にあります。

  1. は、人間が読める
  2. 言語のほとんどのフィッティングと慣用的抽象化を使用して下さい。この場合

、ラインにそれを破ると、ハッシュを構築するためにHash[pairs_of_keys]を使用してみましょう:

db_tables_scanned = if resume and File.exists?(resume_log_file) 
    Hash[IO.readlines(resume_log_file).map do |db_table| 
    if db_table.include?('.') 
     db_table.split(".").first(2).map(&:strip) 
    end 
    end.compact] 
else 
    {} 
end 
+1

いつでもキャリッジリターンやラインフィードを保存するよりも、メンテナンスと可読性が重要です。 'db_tables_scanned'代入を' if'ブロックにも移動します。私たちは 'if'の外側に割り当てることができますが、通常は内部で行うのがより読みやすいです。しかし、それを外に出すことは、もっと「ドライ」です。 –

+0

@ The Tin Man:Rubyコミュニティにifブロックを式やステートメントとして使用するかどうかは一致しません。私は機能的なバックグラウンドを持っているので、明らかに私はそれを表現として使用するのがとても快適だと感じています。私は特に、コードブロックの範囲がどのように縮小されるのが好きです。一見すると、ブロックが何をしているのか気にしません。単に "db_tables_scanned"オブジェクトを返します。私はちょうど公式の文書をチェックしました、そして、私はこの建設の例を見つけるのに驚いた:http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/( "すべてが価値を持っている" ) – tokland

関連する問題