数値が(1つのステートメントで)範囲に含まれているかどうかを確認するにはどうすればよいですか?


86

Ruby on Rails 3.0.9を使用していますが、範囲に数値が含まれているかどうかを確認したいと思います。つまり、変数がある場合、値がその範囲に含まれているかどうかnumber = 5を確認1 <= number <= 10してブール値を取得したいと思いnumberます。

私はこのようにそれを行うことができます:

number >= 1 && number <= 10

しかし、私はそれを1つのステートメントで行いたいと思います。どうやってやるの?


あなたの引用された声明には何も悪いことはないので、それは疑問を投げかけます:なぜそれをさらに「短縮」したい/必要なのですか?
DarkDust 2011

1
@ DarkDust-可能な限り少ないコード!
backo 2011

回答:


163

(1..10).include?(number) トリックです。

ところで:を使用して数値を検証したい場合はActiveModel::Validations、次のこともできます。

validates_inclusion_of :number, :in => 1..10

validates_inclusion_ofについてここを読んでください

またはRails3 +の方法:

validates :number, :inclusion => 1..10

nilも許可したい場合はどうすればよいですか?ゼロのときにエラーが発生します。
user2503775 2014年

5
Railsにはオプションがありますallow_nil。:ちょうどそのようにそれを追加, allow_nil: true
マリオUHER

65

Enumerable#include?

(1..10).include? n

Range#cover?

(1..10).cover? n

Comparable#between?

n.between? 1, 10

数値バリデーター

validates :n, numericality: {only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 10}

包含バリデーター

validates :n, inclusion: 1..10

1
検証テキストの方が理にかなっているので、私はこの方法の方が好きです。
ダン

私はすでに数値を検証していたので、私はそれがより好きです。それを1行にします:)
BradGreens 2013

@BradGreensそれは1つの長い行です。
wchargin 2013

1
特定のロジックまたは関連付けへのアクセスが必要な場合は、procを使用できることに注意してください。例えばvalidates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
ЕвгенийМасленков

16

検証プロセスの一部でない場合は、次を使用できます#between?

2.between?(1, 4)
=> true

7

フォーム送信の正確なエラーメッセージについては、これらを試してください

validates_numericality_of :tax_rate, greater_than_or_equal_to: 0, less_than_or_equal_to: 100, message: 'must be between 0 & 100'

3

Rails 4

ActiveModel :: Validationsを介して必要な場合は、使用できます

validates_inclusion_of :number, :in => start_number..end_number

またはRails3構文

validates :number, :inclusion => start_number..end_number

しかし、私が見つける最も簡単な方法は

number.between? start_number, end_number


おそらくいくつかの説明が含まれています。
GMchris 2016年

2

Ruby 1.9では、最も直接的な翻訳はRange#coverのようです。

objがbegとendの間にある場合、つまりbeg <= obj <= endの場合(またはexclude_end?がtrueの場合はend Exclusive)、trueを返します。

それがどう違うのか疑問に思ったら Range#include?が、数値以外の範囲の場合、後者は範囲のすべての要素を反復処理します。詳細な説明については、このブログ投稿を参照してください。


1

カスタム配列に特定の番号が存在することを確認したい場合は、

たとえば、5がlist = [1,4,6,10]に含まれているかどうかを知りたいです。

list.include? 5 => false
list.include? 6 => true
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.