2015-09-29 16 views

Trả lời

2

Biến cục bộ được xác định (như nil) tại thời điểm chúng được phân tích cú pháp. Định nghĩa của var2 trước điều kiện. Điều đó làm cho var2 được xác định ngay cả khi việc gán không được thực hiện. Sau đó, điều kiện đánh giá rằng var2 được xác định, giữ lại giá trị nil cho var2.

10

Đây là một trong những khoảnh khắc duy nhất trong Ruby tôi gọi là WTF thực tế.

Bạn phải sử dụng

unless defined? var 
    var = :value 
end 

Với cú pháp postfix, người phiên dịch sẽ nội nil -ify giá trị để nó có thể suy luận về sự thay đổi, do đó làm cho nó được xác định trước khi kiểm tra được thực hiện:

# Doesn't print anything 
unless defined?(foo) and (p(foo) or true) 
    foo = :value 
end 

# Prints nil 
bar = :value unless defined?(bar) and (p(bar) or true) 
Các vấn đề liên quan