5

是否可以使此代码更紧凑?我在这里错过了什么吗?

    if value < min_rate
      min_rate
    elsif value > max_rate
      max_rate
    else
      value
    end
4

9 回答 9

3

对我来说,这看起来更具可读性和易于理解。希望你喜欢。

def some_method    
  return min_rate if value < min_rate
  return max_rate if value > max_rate

  value
end
于 2012-11-09T16:26:20.770 回答
3

这是完全不同的东西:

[min_rate, value, max_rate].sort[1]
于 2012-11-09T23:31:30.380 回答
2

max(min(value, max_rate), min_rate). 这分别隐藏了min和内部的 if 分支(“iffing”?) max

于 2012-11-09T14:19:17.373 回答
1

三元赋值“更紧凑”,但绝对不是更漂亮:

value = (value < min_rate) ? min_rate : (value > max_rate) ? max_rate : value
于 2012-11-09T14:22:54.867 回答
1

你需要的是嵌套三元运算符

value < min_rate ? min_rate :
value > max_rate ? max_rate :
value

如果您愿意,您可以将所有内容放在一行中,这样做只是为了便于阅读,这样做是为了

于 2012-11-24T09:46:39.190 回答
0

好吧,我同意@pwned,但有一种更优雅的方式。恕我直言,是同样的事情,但阅读效果更好。

  def calculate(value)
    return min_rate if value < min_rate
    return max_rate if value > max_rate
    value
  end

我根本不喜欢那种层叠风格。=)

于 2012-11-09T18:33:09.060 回答
0

您可以尝试使用实用方法扩展 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
于 2012-11-12T23:48:12.560 回答
0
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

$ 真

于 2012-11-24T08:35:43.190 回答
0

自 Ruby 2.4(2016 年 12 月)以来,我们有一个方法可以做到这一点Comparable#clamp

value = 15
value.clamp(10, 20) # => 15
value.clamp(0, 10) # => 10
value.clamp(20, 30) # => 20

由于它是 Comparable 的一部分,因此它适用于任何包含 Comparable 的类,例如:

"foo".clamp("bar", "baz") # => "baz"
于 2019-06-27T15:11:19.427 回答