2012-06-13 22 views
13

Tại sao mã này không hoạt động?Ruby nếu so với cuối dòng nếu hoạt động khác nhau?

b if b = true 

Lỗi: undefined local variable or method `b'

Nhưng điều này:

if b = true 
    b 
end 

nên không họ có giống nhau không?

+2

Nó có thể được đơn giản hóa: 'k nếu k = 1' và' nếu k = 1; k; end' – Flexoid

+0

Điều này đã được một chút khó chịu của tôi; Tôi không nghĩ rằng có bất kỳ lý do sâu sắc tại sao mã của bạn không thể làm việc, vì vậy có lẽ họ sẽ thêm tính năng này trong phiên bản tiếp theo của ruby. –

+0

Điều kiện là các biểu thức giống như bất kỳ điều gì khác trong Ruby, vì vậy hành vi này được mong đợi khi trình phân tích cú pháp tìm cách gán các biến và sẽ khó thay đổi. Tôi đồng ý mặc dù nó khá là không trực quan và không tuân theo nguyên tắc ít ngạc nhiên nhất. –

Trả lời

15

Đây là một câu hỏi rất tốt. Nó có liên quan đến phạm vi biến trong Ruby.

Đây là một post by Matz on the Ruby bug tracker về điều này:

local variable scope determined up to down, left to right. So a local variable first assigned in the condition of if modifier is not effective in the left side if body. It's a spec.

+1

+1 để tham khảo. –

+0

Cảm ơn vì lý do. –

+0

+1 tham chiếu tuyệt vời – KensoDev

2

Trong phiên bản đầu tiên ngay sau khi k bị trúng, phân tích cú pháp phân tích bởi vì nó chưa được nhìn thấy.

Trong phiên bản thứ hai, k là một phần của biểu thức chỉ định và được phân tích cú pháp khác nhau.

2

Tôi không biết lý do nhưng vấn đề mà thông dịch viên tìm kiếm biến số k trước khi đánh giá điều kiện.

Nếu bạn viết nó như thế này, sẽ không có bất kỳ lỗi và làm việc như bạn mong đợi:

k = nil 
h = {k: 1} 
v = k if k = h.delete(:k) 
0

Bởi vì người phiên dịch của Ruby tạo ra một biến địa phương khi nó thấy một bài tập

Trong trường hợp thứ hai, nó vẫn chưa thấy sự phân công , do đó, biến không tồn tại khi biểu thức được phân tích cú pháp.

Để chính xác hơn, một phương pháp được phân tích cú pháp đầu tiên thành một biểu diễn bên trong, và sau đó, có lẽ, mã cuối cùng sẽ được gọi và thực thi.

Biến cục bộ được tạo trong lần phân tích cú pháp đó. Đó là vấn đề tuyên bố, nó chỉ có nghĩa là thông dịch viên nhận thức được chúng. Chúng sẽ không được tạo ra theo nghĩa là được cho không gian hoặc một giá trị cho đến khi phương pháp xung quanh được gọi bởi ai đó.

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