2010-09-27 30 views

Trả lời

9

Nó chủ yếu được sử dụng như một shortform cho khởi tạo một biến đến một giá trị nhất định, nếu nó chưa được thiết lập.

Suy nghĩ về tuyên bố khi trả lại x || (x = y). Nếu x có giá trị (ngoài false), chỉ phía bên trái của || sẽ được đánh giá (kể từ ||ngắn-circuts) và x sẽ không được gán lại. Tuy nhiên, nếu xfalse hoặc nil, phía bên phải sẽ được đánh giá, sẽ đặt x thành yy (kết quả của câu lệnh gán là phía bên tay phải).

Xem http://dablog.rubypal.com/2008/3/25/a-short-circuit-edge-case để thảo luận thêm.

+0

+1 quên nó –

+0

'x || = y' hoạt động như' x = y trừ khi x' (nếu chúng ta giả sử x và y đứng cho các biểu thức tùy ý và không nhất thiết là biến) là * không * giống như 'x = y = x || y' (xem xét các trường hợp trong đó 'x = x' không phải là no-op) hoặc' x = y nếu x.nil? '(xem xét trường hợp x là sai). – sepp2k

+0

Jorg W Mittag cho rằng điều này là không chính xác, trong [câu trả lời của anh] (http://stackoverflow.com/questions/995593/what-does-mean-in-ruby) đối với câu hỏi trùng lặp. –

3

Ý tưởng là giống như với những hoạt động khác tương tự (+=, *=, vv):
a ||= ba = a || b

Và thủ thuật này không bị giới hạn chỉ Ruby: nó đi qua nhiều ngôn ngữ với rễ C.

chỉnh sửa để đẩy lùi trình gỡ xuống.
Xem một trong các liên kết của Jörg để có xấp xỉ chính xác hơn, ví dụ this one.
Đây chính xác là lý do tại sao tôi không thích Ruby: không có gì là gì cả.

+1

Đáng chú ý, không phải C hoặc C++ hoặc Java. – SingleNegationElimination

+0

@TokenMacGuy Tôi có nghĩa là 'lừa đảo' chung: sản xuất 'a @ = b' từ 'a = a @ b'. –

+0

Điều này là sai. Vui lòng đọc http://Ruby-Forum.Com/topic/151660 và các liên kết được cung cấp trong đó. –

4

x ||= y thường được sử dụng thay cho x = y if x == nil