このコードをよりコンパクトにすることは可能ですか?ここに何か足りないものがありますか?
if value < min_rate
min_rate
elsif value > max_rate
max_rate
else
value
end
このコードをよりコンパクトにすることは可能ですか?ここに何か足りないものがありますか?
if value < min_rate
min_rate
elsif value > max_rate
max_rate
else
value
end
私にとって、これはより読みやすく、簡単に理解できるように見えます。あなたがそれを好きになることを願っています。
def some_method
return min_rate if value < min_rate
return max_rate if value > max_rate
value
end
これは完全に異なるものです:
[min_rate, value, max_rate].sort[1]
max(min(value, max_rate), min_rate)
. min
これにより、それぞれおよび内の if-分岐 ("iffing"?) が隠さmax
れます。
必要なものはネストされた三項演算子と呼ばれます
value < min_rate ? min_rate :
value > max_rate ? max_rate :
value
必要に応じて、すべてを1行に入れることができます。読みやすさを目的として、そのようにしただけです
三項代入は「よりコンパクト」ですが、間違いなくきれいではありません。
value = (value < min_rate) ? min_rate : (value > max_rate) ? max_rate : value
class Range
def limit(value)
if value> last
last
elsif value< first
first
else
value
end
end
end
p (-50..50).map{ |n| (10..20).limit(n) }.uniq== (10..20).to_a
$真
ユーティリティ メソッドを使用して Range を拡張してみてください。
module RangeHelper
def bound value
value < self.begin ? self.begin :
value > self.end ? self.end :
value
end
end
Range.class_eval { include RangeHelper }
(1..10).bound 5 # => 5
(1..10).bound -5 # => 1
(1..10).bound 15 # => 10
まあ、私は@pwnedに同意しますが、もっとエレガントな方法があります. 私見は同じことですが、より良い読み方があります。
def calculate(value)
return min_rate if value < min_rate
return max_rate if value > max_rate
value
end
私はそのカスケードスタイルがまったく好きではありません。=)