代码之家  ›  专栏  ›  技术社区  ›  mb14

是否有限制/钳制数字的方法?

  •  32
  • mb14  · 技术社区  · 12 年前

    我写了以下代码 x 在范围内 (a..b) .在伪代码中:

    (if x < a, x = a; if x > b, x = b)
    

    在Ruby中,它将类似于:

    x = [a, [x, b].min].max
    

    由于这是一个非常基本和有用的函数,我想知道在ruby中是否有一个本地方法可以做到这一点。

    到Ruby 2.3.3为止,显然还没有这样的方法,最短/可读性更强的方法是什么?

    我发现:

    x = [a, x, b].sort[1]
    

    到目前为止,但我不确定它是否更可读。

    5 回复  |  直到 8 年前
        1
  •  61
  •   Drenmi    8 年前

    Ruby 2.4.0介绍 Comparable#clamp 以下为:

    523.clamp(0, 100)        #=> 100
    
        2
  •  37
  •   mb14    10 年前

    我自己的回答:不

    然而

    x = [a, x, b].sort[1]
    

    是一个解决方案。

        3
  •  12
  •   Zeddy    11 年前

    我这样做了:

    class Numeric
      def clamp min, max
        [[self, max].min, min].max
      end
    end
    

    所以,每当我想夹住任何东西时,我可以打电话:

    x.clamp(min, max)
    

    我觉得它很可读。

        4
  •  0
  •   Steve Hay    7 年前

    以下是我的解决方案,它大量借鉴了实际实现:

    unless Comparable.method_defined? :clamp
      module Comparable
        def clamp min, max
          if max-min<0
            raise ArgumentError, 'min argument must be smaller than max argument'
          end
          self>max ? max : self<min ? min : self
        end
      end
    end
    
        5
  •  -1
  •   gamecreature    8 年前

    在我看来,目前最吸引人的解决方案是排序选项:

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

    当你不介意猴子修补现有的核心类时。 我认为range类是clamp方法的一个很好的候选者

    class Range
      def clamp(v)
        [min,v,max].sort[1]
      end
    end
    
    (min..max).clamp(v)
    

    或者普通数组对象。我不喜欢这样,因为clamp函数只适用于3个元素数组

    class Array
        def clamp
          sort[1]
        end
    end
    

    你可以这样称呼它:

    [a,x,b].clamp
    
    推荐文章