【问题标题】:Is there a method to limit/clamp a number?有没有限制/钳位数字的方法?
【发布时间】:2017-11-18 11:08:33
【问题描述】:

我编写了以下代码,它将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]

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

【问题讨论】:

  • 只是一个感兴趣的问题,来自完全原生函数?
  • 你已经回答了你自己的问题 - 很好地使用了排序功能。我不认为你会比这更易读。
  • 您的意思可能是:x2 = [a, [x, b].min].max。在我看来没问题,使用基本的通用方法来构建其余部分。
  • 排序的有趣使用..使整个事情独立于顺序..
  • @tokland:你是对的。我编辑了它

标签: ruby clamp


【解决方案1】:

Ruby 2.4.0 引入Comparable#clamp

523.clamp(0, 100)        #=> 100

【讨论】:

  • 最好的部分:ruby 没有钳位方法的原因是他们无法停止争论函数的名称。
  • 现在终于添加了。
  • 哈哈,我实现了 Comparable#clamp。花了足够长的时间来合并我的补丁... ;-)
【解决方案2】:

我自己的答案:没有

然而

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

是一个解决方案。

【讨论】:

  • 不会撒谎,这很性感。
  • 我认为这可能是我见过的最漂亮的一行代码。
  • 很酷的是,你放置最小值、最大值和 x 的顺序甚至都无关紧要。
【解决方案3】:

我这样做了:

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

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

x.clamp(min, max)

我觉得这很可读。

【讨论】:

    【解决方案4】:

    这是我从实际实现中大量借鉴的解决方案:

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

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

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

      当您不介意猴子修补现有的核心类时。 我认为范围类是钳位方法的良好候选者

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

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

      class Array
          def clamp
            sort[1]
          end
      end
      

      你可以这样称呼它:

      [a,x,b].clamp
      

      【讨论】:

      • 在数组或范围上调用钳位似乎真的是骗人的。这不是有人会想到的结果。猴子修补数字或类似的东西看起来更容易理解恕我直言。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      相关资源
      最近更新 更多