32

x範囲内に収まる次のコードを記述しました(a..b)。擬似コードの場合:

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

Rubyでは次のようになります。

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

非常に基本的で便利な機能なので、ルビーでそれを行うためのネイティブな方法があるのだろうかと思いました。

Ruby 2.3.3の時点では、このような方法は明らかにありませんが、これを行うための最短で読みやすい方法は何でしょうか。

私が見つけた:

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

これまでのところ、もっと読みやすいかどうかはわかりません。

4

5 に答える 5

58

Ruby 2.4.0の紹介Comparable#clamp

523.clamp(0, 100)        #=> 100
于 2012-08-18T23:13:09.273 に答える
37

私自身の答え:いいえ

でも

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

解決策です。

于 2014-02-27T14:39:52.240 に答える
12

これは私がしました:

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

したがって、何かをクランプしたいときはいつでも、次のように呼び出すことができます。

x.clamp(min, max)

私はかなり読みやすいと思います。

于 2014-02-07T20:10:35.863 に答える
0

これが実際の実装から大きく借りた私の解決策です:

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
于 2017-11-18T03:08:33.563 に答える
-1

私の意見では、今のところ最も魅力的な解決策は、並べ替えオプションです。

[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
于 2016-07-26T14:06:00.870 に答える