3

そのため、プロセスをモデル化するプログラムを作成しており、料金を計算する必要があります。ロジックは、手数料額が最小額より少ない場合は最小額を使用し、手数料額が最大額を超える場合は最大額を使用するというものです。

もちろん、これを複数の行で実行することもできますが、Ruby でこれを行うためのよりエレガントな方法があるかどうか知りたいです。

fee_amount = <whatever logic I need>
if fee_amount < min return min
if fee_amount > max return max
return fee_amount
4

8 に答える 8

10

それほど醜くない(または少なくとも短い)ワンライナーを探している場合:

[min,fee_amount,max].sort[1]

一見すると何が起こっているのか直感的ではないため、Rubyish ではありません。

于 2013-04-24T17:27:31.067 に答える
6

1 回だけの場合は、Shawn Balestracci の最も美しい回答をお勧めします。

別の方法として、私の個人的なライブラリからのいくつかのメソッドを次に示します。

module Comparable
  def at_least other; self < other ? other : self end
  def at_most other; self > other ? other : self end
end

私はこのように使用します:

fee_amount = <whatever logic I need>.at_least(min).at_most(max)
于 2013-04-24T17:58:55.077 に答える
4

接尾辞条件を使用します。これはかなりルビー スタイルになります。

return min if fee_amount < min
return max if fee_amount > max
fee_amount
于 2013-04-24T17:22:57.630 に答える
1
n = (n <= max || n >= min) ? n : (n < min ? min : max)

少し一般的

于 2013-04-25T09:20:20.870 に答える
1

これを 1 行で行うエレガントな方法はありません。多くのロジックを 1 行のコードに詰め込むことで、これをエレガントではなくなります

ただし、既存のコードは大幅にクリーンアップできます。

fee_amount = <logic>
fee_amount = min if fee_amount < min
fee_amount = max if fee_amount > max

この非常に醜いワンライナーに対して...

fee_amount = if fee_amount < min then min elsif fee_amount > max then max else fee_amount end
于 2013-04-24T17:22:44.970 に答える