Come verificare se un numero è incluso in un intervallo (in una dichiarazione)?


86

Sto usando Ruby on Rails 3.0.9 e vorrei controllare se un numero è incluso in un intervallo. Cioè, se ho una variabile number = 5vorrei controllare 1 <= number <= 10e recuperare un valore booleano se il numbervalore è incluso in quell'intervallo.

Posso farlo in questo modo:

number >= 1 && number <= 10

ma vorrei farlo in una dichiarazione. Come lo posso fare?


Poiché non c'è niente di sbagliato nella tua dichiarazione citata, si pone la domanda: perché vuoi / hai bisogno di "accorciarla" ulteriormente?
DarkDust

1
@DarkDust - Meno codice nel miglior modo possibile!
Backo

Risposte:


163

(1..10).include?(number) è il trucco.

A proposito: se vuoi convalidare un numero usando ActiveModel::Validations, puoi anche fare:

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

leggi qui su validates_inclusion_of

o il modo Rails 3+:

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

E se volessi consentire anche zero? Ricevo un errore quando è nullo.
user2503775

5
Rails ha un'opzione allow_nil. Aggiungilo in questo modo:, allow_nil: true
Mario Uher

65

Enumerabile # include? :

(1..10).include? n

Copertura gamma #? :

(1..10).cover? n

# Comparabile tra? :

n.between? 1, 10

Validatore numerico :

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

Validatore di inclusione :

validates :n, inclusion: 1..10

1
Mi piace di più questo metodo, perché il testo di convalida ha più senso.
Dan

Mi piace di più perché ero già di convalida numerica. Lo rende una riga :)
BradGreens

@ BradGreens è una lunga fila.
wchargin

1
Voglio notare che puoi usare proc se hai bisogno di una logica specifica o di accesso alle associazioni. Ad esempiovalidates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
Евгений Масленков

16

Se non fa parte di un processo di convalida puoi utilizzare #between?:

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

7

Per messaggi di errore accurati su un modulo di invio, prova questi

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

3

Rotaie 4

se lo vuoi tramite ActiveModel :: Validations puoi usare

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

o la sintassi di Rails 3

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

Ma il modo più semplice che trovo è

number.between? start_number, end_number


Forse includi qualche spiegazione.
GMchris

2

In Ruby 1.9 la traduzione più diretta sembra essere la cover Range #? :

Restituisce vero se obj è compreso tra beg e end, cioè beg <= obj <= end (o end exclusive quando exclude_end? È vero).

Nel caso ti chiedessi come sia diverso da Range#include?, è che quest'ultimo itera su tutti gli elementi dell'intervallo se è un intervallo non numerico. Vedi questo post del blog per una spiegazione più dettagliata.


1

Se vuoi controllare che un particolare numero esista nella matrice personalizzata,

Ad esempio, voglio sapere se 5 è incluso nella lista = [1,4,6,10] o meno

list.include? 5 => false
list.include? 6 => true
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.