Як перевірити, чи включено число в діапазон (в одному твердженні)?


85

Я використовую Ruby on Rails 3.0.9, і я хотів би перевірити, чи включено число в діапазон. Тобто, якщо у мене є змінна, number = 5я хотів би перевірити 1 <= number <= 10та отримати логічне значення, якщо numberзначення включено до цього діапазону.

Я можу зробити це так:

number >= 1 && number <= 10

але я хотів би зробити це одним твердженням. Як я можу це зробити?


Оскільки у вашому цитованому твердженні немає нічого поганого, виникає питання: чому ви хочете / потребуєте подальшого його «скорочення»?
DarkDust

1
@DarkDust - якомога краще коду!
Backo

Відповіді:


161

(1..10).include?(number) це фокус.

До речі: якщо ви хочете перевірити число за допомогою ActiveModel::Validations, ви навіть можете зробити:

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

читайте тут про validates_inclusion_of

або шлях Rails 3+:

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

Що робити, якщо я хочу також дозволити нуль? Я отримую повідомлення про помилку, коли нуль.
user2503775

5
Рейки мають опцію allow_nil. Просто додайте це так:, allow_nil: true
Маріо Угер

64

Численні # включають? :

(1..10).include? n

Обкладинка # діапазону? :

(1..10).cover? n

Порівняно # між? :

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
Мені більше подобається цей метод, оскільки текст перевірки має більше сенсу.
Ден,

Мені це подобається більше, тому що я вже перевіряв чисельність. Робить це в один рядок :)
BradGreens

@BradGreens це одна довга черга.
wchargin

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

6

Щоб отримати точні повідомлення про помилки у формі, спробуйте їх

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

3

Рейки 4

якщо ви хочете через ActiveModel :: Validations, якими ви можете скористатися

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

або синтаксис Rails 3

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

Але найпростіший спосіб, який я знаходжу, - це

number.between? start_number, end_number


Можливо, включте якесь пояснення.
GMchris

2

У Ruby 1.9 найбільш прямим перекладом видається Range # cover? :

Повертає true, якщо obj знаходиться між beg та end, тобто beg <= obj <= end (або end exclude, коли exclude_end? True).

Якщо вам цікаво, чим це відрізняється Range#include?, це те, що останній перебирає всі елементи діапазону, якщо це нечисловий діапазон. Дивіться цю публікацію в блозі для більш детального пояснення.


1

Якщо ви хочете перевірити, чи існує конкретний номер у власному масиві,

Наприклад, я хочу знати, включено 5 у список = [1,4,6,10] чи ні

list.include? 5 => false
list.include? 6 => true
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.