如何以更优雅的方式写下这三个案例?

时间:2012-11-09 14:17:49

标签: ruby coding-style conditional-statements

我希望这种逻辑能够以更加优雅和紧凑的方式编写,在我看来,我错过了一些东西:

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

9 个答案:

答案 0 :(得分:3)

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

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

  value
end

答案 1 :(得分:3)

这是完全不同的东西:

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

答案 2 :(得分:2)

max(min(value, max_rate), min_rate)。这会分别隐藏minmax内的if-branching(“iffing”?)。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您需要的是称为嵌套三元运算符

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

会这样做 如果你愿意的话,你可以将所有内容放在一行中,这只是为了可读性,它就是这样做的

答案 5 :(得分:0)

嗯,我同意@pwned,但有一种更优雅的方式。恕我直言是一回事,但有更好的阅读。

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

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

答案 6 :(得分: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

答案 7 :(得分: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
  

$ true

答案 8 :(得分: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"