2011-02-10 31 views
6

Một ngớ ngẩn, cú pháp câu hỏi:của Ruby Phân Cú pháp

Nếu toán tử gán thực sự là một chức năng, như

def value=(x) 
    @value = x 
end 

mà không có một khoảng trống giữa các toán hạng bên trái và "=", thì tại sao phép gán có thể được thực hiện dưới dạng test.value = x (có dấu cách), nhưng định nghĩa phương thức không thể được viết là:

def value = (x) 
    @value = x 
end 

với khoảng trắng. Đây có phải là cú pháp đơn giản được quyết định bởi trình phân tích cú pháp không?

+1

Bạn có thể hỏi là tốt, "Nếu sữa có màu trắng, tại sao bầu trời không? .." –

Trả lời

6

def cần được theo sau bằng mã thông báo cho tên hàm, tùy chọn theo sau bởi danh sách đối số. Dấu ngoặc đơn trên danh sách đối số là tùy chọn (ví dụ: def value= x là định nghĩa phù hợp). def value = (x) trông giống như def theo sau là hai thẻ và sau đó là danh sách đối số, không phân tích cú pháp.

+0

Các phân tích cú pháp là đủ thông minh để biết rằng báo cáo kết quả test.value = x không phải là một mã thông báo, theo sau là hai tham số được truyền. Tại sao nó không phân tích cú pháp định nghĩa phương thức tương tự? – inyourcorner

+0

@inyourcorner nhưng bạn không dựa vào từ khóa 'def' trong ví dụ của bạn – Woot4Moo

+0

@inyourcorner: Điều đó hoàn toàn khác với định nghĩa hàm. Trình xử lý cho phép gán biết để kiểm tra các phương thức value = trong đối tượng nhận (phân tích cú pháp không liên quan). – cam

1

Đó là phép thuật phân tích cú pháp/thông dịch viên.

Khi thông dịch viên thấy nhiệm vụ tìm kiếm phương thức phù hợp.

Tôi đồng ý với bạn về vấn đề này (gần như), tôi cho rằng nhiệm vụ phải là some.value= x (không có khoảng trống giữa 'giá trị' và '=').

Scala làm điều gì đó tương tự nhưng sử dụng một dấu gạch dưới def value_= (x: X)

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