Como verificar se um número está incluído em um intervalo (em uma declaração)?

86

Estou usando Ruby on Rails 3.0.9 e gostaria de verificar se um número está incluído em um intervalo. Ou seja, se eu tiver uma variável number = 5, gostaria de verificar 1 <= number <= 10e recuperar um valor booleano se o numbervalor estiver incluído nesse intervalo.

Eu posso fazer isso assim:

number >= 1 && number <= 10

mas eu gostaria de fazer isso em uma declaração. Como eu posso fazer isso?

Backo
fonte
Uma vez que não há nada de errado com sua declaração citada, ela levanta a questão: por que você quer / precisa "encurtá-la" ainda mais?
DarkDust
1
@DarkDust - Menos código o melhor possível!
Backo

Respostas:

163

(1..10).include?(number) é o truque.

A propósito: se quiser validar um número usando ActiveModel::Validations, você pode até fazer:

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

leia aqui sobre validates_inclusion_of

ou a maneira Rails 3+:

validates :number, :inclusion => 1..10
Mario Uher
fonte
E se eu também quiser permitir nulo? Estou recebendo um erro quando é nulo.
user2503775
5
Rails tem uma opção allow_nil. Basta adicioná-lo assim:, allow_nil: true
Mario Uher
65

Enumeráveis ​​# incluem? :

(1..10).include? n

Faixa # cobertura? :

(1..10).cover? n

# Comparável entre? :

n.between? 1, 10

Validador de numericalidade :

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

Validador de inclusão :

validates :n, inclusion: 1..10
tybro0103
fonte
1
Eu gosto mais desse método, porque o texto de validação faz mais sentido.
Dan de
Eu gosto mais porque eu já estava validando a numericidade. Torna-se uma linha :)
BradGreens
@BradGreens é uma longa fila.
wchargin
1
Eu quero observar que você pode usar proc se vc precisar de alguma lógica específica ou acesso a associações. Por exemplovalidates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
Евгений Масленков
16

Se não fizer parte de um processo de validação, você pode usar #between?:

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

Para obter mensagens de erro precisas em um envio de formulário, tente estes

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

Rails 4

se você quiser através de ActiveModel :: Validations, você pode usar

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

ou a sintaxe do Rails 3

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

Mas a maneira mais simples que encontro é

number.between? start_number, end_number

Sudhir Vishwakarma
fonte
Talvez inclua alguma explicação.
GMchris de
2

Em Ruby 1.9, a tradução mais direta parece ser Range # cover? :

Retorna true se obj estiver entre beg e end, ou seja, beg <= obj <= end (ou end exclusivo quando exclude_end? For verdadeiro).

Caso você esteja se perguntando como isso é diferente de Range#include?, é que o último itera sobre todos os elementos do intervalo, se for um intervalo não numérico. Veja esta postagem do blog para uma explicação mais detalhada.

Michael Kohl
fonte
1

Se você quiser verificar se existe um determinado número na matriz personalizada,

Por exemplo, quero saber se 5 está incluído na lista = [1,4,6,10] ou não

list.include? 5 => false
list.include? 6 => true
Lakhani Aliraza
fonte