2013-05-11 31 views
5

Tôi vừa gặp một lỗi đáng lo ngại trong ứng dụng đường ray của mình và tôi phát hiện ra rằng vấn đề là 0! Tôi đã giả định điều đó, điều đó đúng.! 0 là sai trong đường ray. Tại sao?

Tôi đã có ấn tượng về điều đó! toán tử sẽ đảo ngược các bit trong một số nguyên vì vậy 0 sẽ trở thành tất cả 1 và do đó sẽ là đúng.

Đó không phải là trường hợp, tại sao?

Cũng lưu ý từ các đường ray console:

1.9.3p286 :002 > !0 
=> false 
1.9.3p286 :003 > 0 
=> 0 
1.9.3p286 :004 > !1 
=> false 
1.9.3p286 :005 > !!0 
=> true 
1.9.3p286 :006 > !0 
=> false 
1.9.3p286 :007 > !23 
=> false 
+0

Từ wikipedia (http://en.wikipedia.org/wiki/Ruby_%28programming_language%29): "Đánh giá Boolean dữ liệu không phải là boolean là nghiêm ngặt: 0," "và [] là tất cả được đánh giá là đúng. " –

+0

Từ các tài liệu chính thức: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html#UF – Pigueiras

+0

Thao tác bit không liên quan. – sawa

Trả lời

11

0 không tương đương với false. 0 là giá trị số nguyên và giá trị boolean của tất cả các số nguyên là true. Những điều duy nhất đánh giá là falsenil và, rõ ràng là false.

Cho rằng 0true, !0 là, theo trực giác, false.

! không phải là nhà khai thác bit-khôn ngoan, nó là hợp lý NOT. Có lẽ bạn có nghĩa là ~0?

+1

Giải thích về downvotes sẽ được đánh giá cao như tôi tôi không chắc phần nào của câu trả lời của tôi bị hiểu sai hoặc không phù hợp. –

+0

Cảm ơn Ant P. Tôi không biết giá trị boolean bằng 0 là đúng trong ruby. Tôi đoán trong giá trị boolean C là 0 là sai. –

+0

Câu trả lời này gây hiểu lầm mạnh mẽ. Có hay không '0' tương đương với' false' là không liên quan. 'nil' không tương đương với' false', nhưng là falesy. Cũng không có thứ gì như "giá trị boolean của (tất cả) số nguyên", và cũng gây hiểu nhầm để viết như thể '0' là' true'; nó không phải là 'đúng', nhưng là sự thật. Và 'nil' không đánh giá thành' false'; nó là falesy. Nhìn chung, câu trả lời của bạn rất không chính xác và gây hiểu nhầm. – sawa

6

Trong ruby ​​chỉ có hai giá trị đánh giá sai trong biểu thức logic: false và nil. Vì 0 không phải là của chúng, nó đánh giá là đúng và do đó, true bằng false.

3

Từ this blog

Hầu hết các đối tượng trong Ruby sẽ có một giá trị boolean true. Chỉ hai đối tượng có giá trị boolean là false, đây là các đối tượng false chính nó và đối tượng nil.

Vì vậy, bất kỳ số nguyên nào (thậm chí 0) đều có giá trị boolean true. Và do đó, !0 đánh giá là false

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