2012-02-24 1 views
2

これは私が見つけた最も近いですが、それは数字の代わりにブール値を扱う:コードが短くて読みやすい保ちながら、私は、Rubyで0シナリオによる除算を避けるためにしようとしている DRY up Ruby ternaryRubyの3進数が短くなっていますか?

私は、コードの次のビットがより簡潔にしたい:

number_to_percentage ((percent_complete.nan? ? 0 : (percent_complete * 100)), :precision => 0) 

または

number_to_percentage ((percent_complete.nan? ? 0 : percent_complete) * 100, :precision => 0) 

ちょうど今読むためには本当に難しいようです。より多くの連鎖が関わっているので、percent_completeは実際にはかなり長くなります。私はメソッドからこの値を返すので、もう一度長くなります。

一時変数を使用したりメソッド名を短縮したりしないようにしたいので、別の方法を知りたいと思っていました。

"percent_complete"を2回入力しなくても済むようにすれば、それはかなり解決します。

+0

'percent_complete'をNaNではなくnilにすることができますか?次に、 'nil.to_i == 0'を利用することができます。 –

+0

@muが短すぎます:提案していただきありがとうございます。私はそれを無しに変更できるかどうか分からない。私はそれを調べなければならないでしょう。現在、percent_completeはfloatをfloatで割ったものです。 –

+0

個人的には、文体的な面では、メソッドへのパラメータリスト内の三項文が見えないほうがいいでしょう。 –

答えて

1

私は思いますdesiのNaNを扱うカスタムヘルパーを追加するだけです赤い方法。

# in app/helpers/extra_number_helper.rb 
module ExtraNumberHelpers 
    def number_or_nan_to_percentage(number, options = { }) 
     number = 0 if(number.respond_to(:nan?) && number.nan?) 
     number_to_percentage(number, options) 
    end 
end 

特別なNaN処理が必要な場合は、number_or_nan_to_percentageを使用してください。これには、コードで作業している人々に、NaNを明示的に処理している人に可能な値を伝えるという幸せな副作用もあります。

+0

この提案をありがとう。その幸せな副作用は間違いなく大きなプラスです。 –

4

なぜNumericで新しいメソッドを定義しないのですか?

class Numeric 
    def safe_to_f 
    self.nan? ? 0.0 : self.to_f 
    end 
end 

あなたが好きならば、あなたも追加することができます。

class Object 
    # substitute a different object if 'predicate' is true 
    # if 'predicate' is :nil?, this is just like || 
    def guard(predicate,substitute) 
    send(predicate) ? substitute : self 
    end 
end 

あなたが書くことができるようになる:

class NilClass 
    def safe_to_f 
    0.0 
    end 
end 

をここでは別の考えです

percent_complete.guard(:nan?, 0) 
+0

提案していただきありがとうございます。私は何か「組み込み」のものがあることを望んでいましたが、それは間違いなく機能します。再度、感謝します! –

+1

@ALiこれはRubyの素晴らしい点の1つです。言語を「曲げる」方法がたくさんあり、組み込みのものだけに縛られることはありません。コアクラスの拡張に慣れましょう。あなたがうまくいけば、多くの状況でコードをより簡潔かつエレガントにする強力なテクニックです。 –

+0

これらの素晴らしい提案に感謝します。どの人を連れて行くか決めるのは難しいです。 –

関連する問題