2011-11-11 25 views
5

thể trùng lặp:
Difference between “and” and && in Ruby?
Ruby: difference between || and 'or'Ruby 'hoặc' vs '||'

tôi đã mã này (một cái gì đó như thế này)

foo = nil or 4 

nơi tôi muốn foo là một trong hai giá trị đầu tiên (có thể là nil) hoặc mặc định 4. Khi tôi thử nghiệm trong irb, đầu ra là những gì tôi mong đợi nó được. Silly tôi, tôi đã không kiểm tra giá trị của foo sau đó. Sau một thời gian, tôi bắt đầu nhận thấy một số lỗi trong mã của mình, và tôi không tìm thấy vấn đề cho đến khi tôi DID kiểm tra giá trị của foo trở lại trong irb, được, bất ngờ, nil thay vì dự kiến ​​4.

Câu chuyện về or|| là gì? Họ có phải làm việc thay thế không? Có một số cảnh báo về việc sử dụng or thay vì || không?

+0

Mặc dù tôi đồng ý rằng các câu hỏi có liên quan trực tiếp, và có một câu trả lời gần giống nhau, họ không phải là những câu hỏi tương tự. Nếu cái đầu tiên được mở rộng để so sánh 'hoặc' so với' || 'cũng như' và' so với '&&', tôi đồng ý rằng chúng trùng lặp. – zzzzBov

+0

Xem thêm http://stackoverflow.com/questions/1434842/is-there-any-wisdom-behind-and-or-operators-in-ruby, http://stackoverflow.com/questions/3904888/why-and -hoặc hành vi-khác nhau-trong-đường ray, & c. – jball

Trả lời

12

Vấn đề ở đây là ưu tiên. or có mức ưu tiên thấp hơn so với ||. Vì vậy, tuyên bố đầu tiên của bạn để đánh giá

(x = nil) or 4 

Kết quả của biểu4 (đó là lý do tại sao bạn nghĩ rằng nó đang làm việc một cách chính xác trong irb), nhưng x được gán nilor có độ ưu tiên thấp hơn so với thực hiện = .

Phiên bản || làm những gì bạn muốn:

x = (nil || 4) 
2

or có (rất) ưu tiên thấp hơn.

4

or có mức ưu tiên thấp hơn cả ||= - điều đó có nghĩa là việc gán được thực thi trước or. Trong khi || có mức độ ưu tiên cao hơn = và được thực thi trước.