2010-09-24 36 views
10
>> current_user.first_visit 
=> 0 
>> if current_user.first_visit 
>> puts "test" 
>> end 
test 
=> nil 

Tại sao in thử nghiệm?Tại sao tôi không thể làm "nếu không" bằng ruby?

+0

Có vẻ như câu hỏi của bạn đã được trả lời. Nhưng bạn nên ngừng sử dụng các giá trị số cho true/false. Sử dụng các từ khóa đúng và sai nếu ngôn ngữ của bạn hỗ trợ chúng – colithium

+0

Rails đã mở rộng loại số nguyên. Bạn cũng có thể sử dụng "if current_user.first_visit.zero?" – vise

+1

@vise: '.zero?' Là dạng ruby ​​cũ: [liên kết APIdock.com] (http://apidock.com/ruby/v1_8_6_287/Numeric/zero%3F) –

Trả lời

16

Trong Ruby chỉ nil có thể được coi là tương tự như false. Không có giả thuyết, rằng 0, "" hoặc [] nghĩa false, vì vậy bạn phải sử dụng == 0, .blank?, .empty?, .zero? vv

Nhưng nil không phải lúc nào hành xử như false. Ví dụ, trong chuỗi suy, phương pháp .to_s được áp dụng cho #{} nội dung, mà làm việc khác nhau cho FalseClassNilClass:

irb(main)> "qwe #{false} rty" 
=> "qwe false rty" 
irb(main)> "qwe #{nil} rty" 
=> "qwe rty" 
+1

Xin lưu ý rằng '.blank?', '.empty? 'là các phần mở rộng được cung cấp bởi framework Rails (thông qua' activesupport') và không có sẵn trong Ruby Standard hoặc Core Lib. Ngoài ra, hành vi khác nhau là vì "# {false}" gọi phương thức 'to_s'. – Swanand

+2

@swanand: 'zero?' Và 'empty?' Có trong lib lõi (không chắc chắn lớp nào bạn đã có trong tâm trí, mặc dù). –

+0

Chỉnh sửa của @ pdom là chính xác. IDK, tại sao những người khác từ chối nó. http://stackoverflow.com/review/suggested-edits/7845176 – Nakilon

6

Bạn có thể nghĩ đến Ruby nếu như thử nghiệm hoặc là một boolean, hoặc cho sẵn của dữ liệu (so với nil). Việc chuyển đổi ngầm từ 0 thành false được hỗ trợ bởi C và (do đó các ngôn ngữ khác như C++) là một vật phẩm lịch sử từ những ngày trước khi C có kiểu boolean riêng biệt. Ở đó, nó dựa trên 0 là một giá trị sentinel thuận tiện hoặc có một ý nghĩa trực quan. Đối với nhiều thứ (ví dụ: một số quốc gia có kích thước quần áo nằm trong khoảng từ 0 đến 8, kết quả cuộc gọi hàm POSC libC) không chuyển đổi độc đáo sang logic boolean tương đương, vì vậy không phải là điều xấu mà Ruby đi theo cách riêng của nó.

Từ quan điểm này, vấn đề với mã của bạn là current_user.first_visit - tên trong đó ngụ ý một kiểu boolean - thực sự giữ 0 và không sai. Ngoài ra, nếu bạn có current_user.visit_counter rõ số, nó sẽ tự nhiên và chính xác để sử dụng một trong số:

current_user.visit_counter > 0 
current_user.visit_counter >= 1 
current_user.visit_counter != 0 
1

Bạn có thể thử này

>> current_user.first_visit 
=> 0 
>> if current_user.first_visit != 0 
>> puts "test" 
>> else 
>> puts "fail" 
>> end 
fail 
=>nil 

Khi kiểm tra các giá trị số bạn cũng cần phải khớp với giá trị mong muốn

Các vấn đề liên quan