Làm thế nào để kiểm tra xem một số có được bao gồm trong một dải ô (trong một câu lệnh) hay không?


85

Tôi đang sử dụng Ruby on Rails 3.0.9 và tôi muốn kiểm tra xem một số có được bao gồm trong một dải ô hay không. Nghĩa là, nếu tôi có một biến, number = 5tôi muốn kiểm tra 1 <= number <= 10và truy xuất giá trị boolean nếu numbergiá trị đó được bao gồm trong phạm vi đó.

Tôi có thể làm điều đó như thế này:

number >= 1 && number <= 10

nhưng tôi muốn làm điều đó trong một tuyên bố. Làm thế nào tôi có thể làm điều đó?


Vì không có gì sai với tuyên bố được trích dẫn của bạn, nó đặt ra câu hỏi: tại sao bạn muốn / cần phải "rút ngắn" nó hơn nữa?
DarkDust,

1
@DarkDust - Càng ít mã càng tốt!
Backo

Câu trả lời:


161

(1..10).include?(number) là thủ thuật.

Btw: Nếu bạn muốn xác thực một số bằng cách sử dụng ActiveModel::Validations, bạn thậm chí có thể làm:

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

đọc ở đây về validates_inclusion_of

hoặc cách Rails 3+:

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

Điều gì xảy ra nếu tôi cũng muốn cho phép số không? Tôi gặp lỗi khi nó không.
user2503775

5
Rails có một tùy chọn allow_nil. Chỉ cần thêm nó như vậy:, allow_nil: true
Mario Uher

65

Enumerable # bao gồm? :

(1..10).include? n

Phạm vi # phủ? :

(1..10).cover? n

So sánh # giữa? :

n.between? 1, 10

Trình xác thực số :

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

Trình xác thực bao gồm :

validates :n, inclusion: 1..10

1
Tôi thích phương pháp này hơn, vì văn bản xác thực có ý nghĩa hơn.
Dan

Tôi thích nó hơn vì tôi đã xác thực số lượng. Làm cho nó một một dòng :)
BradGreens

@BradGreens đó là một dòng dài.
tiền ký quỹ

1
Tôi muốn lưu ý rằng u có thể sử dụng proc nếu u cần một số logic cụ thể hoặc quyền truy cập vào các hiệp hội. Ví dụvalidates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
Евгений Масленков

16

Nếu nó không phải là một phần của quy trình xác thực, bạn có thể sử dụng #between?:

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

6

Để có thông báo lỗi chính xác khi gửi biểu mẫu, hãy thử các

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

3

Đường ray 4

nếu bạn muốn nó thông qua ActiveModel :: Validations bạn có thể sử dụng

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

hoặc cú pháp Rails 3

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

Nhưng cách đơn giản nhất tôi thấy là

number.between? start_number, end_number


Có lẽ bao gồm một số lời giải thích.
GMchris

2

Trong Ruby 1.9, bản dịch trực tiếp nhất dường như là Range # cover? :

Trả về true nếu obj nằm giữa hàm xin và kết thúc, tức là cầu xin <= obj <= end (hoặc kết thúc loại trừ khi loại trừ? Là true).

Trong trường hợp bạn tự hỏi điều đó khác với điều đó như thế nào Range#include?, thì phần sau sẽ lặp lại trên tất cả các phần tử của phạm vi nếu đó là phạm vi không phải số. Xem bài đăng trên blog này để được giải thích chi tiết hơn.


1

Nếu bạn muốn kiểm tra số cụ thể tồn tại trong mảng tùy chỉnh,

Ví dụ, tôi muốn biết liệu 5 có được đưa vào danh sách = [1,4,6,10] hay không

list.include? 5 => false
list.include? 6 => true
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.