2010-06-06 27 views
5

Bit của trường hợp cạnh, nhưng bất kỳ ý tưởng nào tại sao & & = sẽ hoạt động theo cách này? Tôi đang sử dụng 1.9.2.Trường hợp Ruby && = edge

obj = Object.new 
obj.instance_eval {@bar &&= @bar} # => nil, expected 
obj.instance_variables # => [], so obj has no @bar instance variable 

obj.instance_eval {@bar = @bar && @bar} # ostensibly the same as @bar &&= @bar 
obj.instance_variables # => [:@bar] # why would this version initialize @bar? 

Để so sánh, || = khởi tạo các instance variable để nil, như tôi mong đợi:

obj = Object.new 
obj.instance_eval {@foo ||= @foo} 
obj.instance_variables # => [:@foo], where @foo is set to nil 

Cảm ơn!

+0

Bài đăng này được tìm thấy dễ thương với [SymbolHound] (http://www.symbolhound.com/)! –

Trả lời

5

Điều này là do @bar đánh giá sai, và do đó &&= sẽ đánh giá biểu thức không xa hơn ... Ngược lại với biểu thức thứ hai, gán cho @bar trong mọi trường hợp, bất kể biểu thức sau giải quyết như thế nào. Điều tương tự cũng xảy ra với trường hợp ||= đánh giá biểu thức hoàn chỉnh, bất kể giá trị ban đầu @foo được giải quyết là gì.

Vì vậy, sự khác biệt giữa hai biểu thức đầu tiên của bạn là, trong lần gán đầu tiên phụ thuộc vào giá trị (không xác định) của @bar trong trường hợp thứ hai bạn thực hiện bài tập vô điều kiện. &&= KHÔNG phải là lối tắt cho x = x && y. Đó là lối tắt cho x = x && y if x.

+0

Cảm ơn bạn đã làm rõ! Ngoài ra, chỉ cần tham gia Lập trình Ruby 1.9 giải thích điều này ... có lẽ nên tìm kiếm:/ –

+0

@Alan cảm thấy tự do chấp nhận câu trả lời của tôi là câu trả lời nếu nó giải quyết được câu hỏi của bạn. – hurikhan77

+0

Cảm ơn một lần nữa :) Vẫn đang tìm ra trang web ... –

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