如何以更优雅的方式写下这三种情况



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

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

这是完全不同的东西:

[min_rate, value, max_rate].sort[1]

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

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

max(min(value, max_rate), min_rate)。这分别掩盖了minmax内的IF分支(" iffing"?)。

三元分配是"更紧凑的",但绝对不漂亮:

value = (value < min_rate) ? min_rate : (value > max_rate) ? max_rate : value

所需的东西称为嵌套三元运算符

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

那会做的如果需要,您可以将所有内容都放在一行中,仅出于可读性目的,它以这种方式做到了

好吧,我同意 @pwned,但是有一种更加精致的方法。恕我直言是同一回事,但阅读更好。

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

我根本不喜欢那种级联风格。=)

您可以尝试使用实用程序方法扩展范围:

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
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

$ true

自Ruby 2.4(2016年12月)以来,我们有一种可以执行此确切功能的方法: Comparable#clamp

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

由于它是可比的一部分,因此可以与包括可比的任何类一起使用,例如:

"foo".clamp("bar", "baz") # => "baz"

最新更新