2010-02-12 30 views
5

Tôi có tuyên bố if trong ứng dụng Rails của mình. Tôi cần phải làm một loại kiểm tra "nếu đúng và sai" cơ bản. Biểu thức được định nghĩa là:Ruby: Tại sao 'và không' hoạt động khi '&&! (Expr)' không?

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set') 

Nếu tôi đặt biểu thức đó làm nếu, nếu sẽ không kích hoạt. Nếu tôi chạy biểu thức đó trong giao diện điều khiển, tôi nhận được sai.

Bây giờ, nếu tôi sửa đổi biểu thức để đọc:

ActiveRecord::Base.connection.tables.include? 'settings' and not Settings.setting_is_set?('defaults_set') 

Nó trả về true như nó phải, và thực hiện nó là khối.

Vì vậy, câu hỏi đặt ra là: Tại sao 'biểu hiện & &! Biểu thức' không hoạt động như 'biểu thức và không biểu thức'. Đó là sự hiểu biết của tôi & & và! nên tương ứng với và không gần như trực tiếp.

Tôi thiếu gì ở đây?

+0

Nhiều khả năng điều này là do ưu tiên người vận hành. Tôi khá rõ ràng về điều này trong PHP và Python, nhưng không phải Ruby - hy vọng ai đó biết Ruby tốt hơn tôi sẽ đến và giải thích cách nó hoạt động trong Ruby. – JAL

+0

Đây là bản sao chính xác của http://StackOverflow.Com/questions/2083112/ –

Trả lời

6

Bởi vì khi bạn sử dụng && Ruby diễn giải toàn bộ phần cuối của chuỗi khi một đối số được chuyển đến include. Đặt ngoặc quanh 'settings' và báo cáo kết quả đầu tiên sẽ hoạt động tốt:

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set') 
# => false 

ActiveRecord::Base.connection.tables.include?('settings') && !Settings.setting_is_set?('defaults_set') 
# => true 

Bằng cách nào đó, khi bạn sử dụng and not nó biết rằng phần thứ hai không phải là một phần của những gì đang được truyền cho include và cuộc gọi của bạn thành công.

+7

'và' có mức ưu tiên thấp hơn' && '. Đây là một dấu hiệu thông dụng của ruby: http://stackoverflow.com/questions/372652/what-are-the-ruby-gotchas-a-newbie-should-be-warned-about –

+0

Điều này đã làm điều này. Cảm ơn bạn. –

+0

Tôi không bao giờ sử dụng và/hoặc, chỉ &&/||. Trong hầu hết các ngôn ngữ, bạn mong đợi các cấu trúc này có mức độ ưu tiên cao; và/hoặc không. – Shadowfirebird

0

‘not’ là toán tử điều khiển, ! là toán tử logic. Điểm khác biệt là ‘not’ có mức độ ưu tiên thấp hơn khi đánh giá lệnh. Sử dụng ! khi bạn thực hiện các biểu thức logic.

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