Как проверить, входит ли число в диапазон (в одном утверждении)?


86

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

Я могу сделать это так:

number >= 1 && number <= 10

но я хотел бы сделать это в одном заявлении. Как я могу это сделать?


Поскольку в цитируемом вами утверждении нет ничего плохого, возникает вопрос: зачем вообще нужно его «сокращать»?
DarkDust

1
@DarkDust - Как можно меньше кода!
Backo

Ответы:


163

(1..10).include?(number) это уловка.

Кстати: если вы хотите подтвердить номер с помощью ActiveModel::Validations, вы даже можете сделать:

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

читайте здесь о validates_inclusion_of

или способ Rails 3+:

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

Что, если я хочу также разрешить nil? Я получаю сообщение об ошибке, когда оно равно нулю.
user2503775 07

5
У Rails есть опция allow_nil. Просто добавьте это так:, allow_nil: true
Марио Уэр

65

Enumerable # include? :

(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

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

Рельсы 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? :

Возвращает истину, если obj находится между начальным и конечным значениями, т.е. begin <= obj <= end (или end эксклюзивно, если exclude_end? Истинно).

Если вам интересно, чем это отличается от 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.