2016-05-16 13 views
6

Trong Ngôn ngữ lập trình Ruby của David Flanagan; Yukihiro Matsumoto, they state that the variable prefixes ($, @, @@) are one price we pay for being able to omit parentheses around method invocations. Ai đó có thể giải thích điều này với tôi?Tại sao các tiền tố biến đổi trong ruby ​​cho phép bỏ sót dấu ngoặc đơn trong các lời gọi phương thức?

+2

Câu hỏi hay. Tôi không chắc rằng tuyên bố đó là đúng, nói đúng. Tôi luôn luôn nghĩ rằng các tiền tố đã được xác định phạm vi (ví dụ, địa phương, trường hợp, lớp, toàn cầu) hơn là phân biệt các biến từ phương pháp (rõ ràng tên biến địa phương đang được phân biệt từ các cuộc gọi phương pháp của thông dịch viên). – Cubic

+0

Khi bạn hỏi về một tham chiếu cụ thể, ít nhất hãy cung cấp liên kết tới nó nếu nó có sẵn trực tuyến. – sawa

+0

@sawa: [liên kết] (https://books.google.co.jp/books?id=rbY5mz-_VdQC&lpg=PA7&ots=10Wd8nk-uL&pg=PA7#v=onepage&q&f=false) – Amadan

Trả lời

1

Dưới đây là ý kiến ​​chưa trưởng thành của tôi. Nếu tôi sai, hãy sửa tôi.

Giả sử các biến mẫu không có tiền tố @, thì làm cách nào để khai báo biến mẫu?

class MyClass 
    def initialize 
    # Here foo is an instance variable 
    self.foo = 'bar' 
    end 

    # Here foo is an instance method 
    def foo 
    end 

    def bar 
    # Call method. No doubt. 
    self.foo() 

    # Call method? Access instance variable? 
    self.foo 
    end 
end 

Trong trường hợp trên, các instance variable foo được khởi tạo bằng cách sử dụng cú pháp giả

self.foo = 'bar' 

vì chúng ta phải có một cách để nói với người phiên dịch ruby ​​rằng foo thuộc về các trường hợp hiện tại và không phải là biến cục bộ.

Sau đó, trong phương thức bar, nếu dấu ngoặc đơn không được thực thi trong lời gọi phương thức, làm cách nào để thông dịch viên biết liệu self.foo có phải là lời gọi phương thức hay truy cập biến mẫu không?

Có lẽ chúng ta có thể cho phép các biến thể hiện các phương thức thể hiện bóng khi dấu ngoặc đơn bị thiếu, nhưng điều này gây ra mâu thuẫn cú pháp của chính ngôn ngữ đó. Ví dụ, từ bên ngoài định nghĩa MyClass:

obj = MyClass.new 

# Call instance method 
obj.foo 

Đây là một ví dụ phương pháp gọi bởi vì tất cả các instance variable là vô hình từ bên ngoài (ít nhất là không sử dụng lập trình meta). Nhưng self.foo (không có dấu ngoặc đơn) trong phương thức bar là truy cập biến mẫu. Cú pháp không thống nhất này có thể dẫn đến lỗi. Ngoài ra, nó mang lại khó khăn trong việc thực hiện các thông dịch viên chính nó.

Sau đó, phương pháp cho phép dụ thể hiện các biến đối tượng? Sau đó, các lập trình viên phải đảm bảo các tên biến instance không va chạm với các tên của instance instance, nếu không các biến instance sẽ không thể truy cập được. Sẽ rất khó khăn nếu một lớp có một chuỗi tổ tiên lâu bởi vì người ta phải kiểm tra những va chạm không chỉ trong định nghĩa lớp hiện tại, mà còn trong tổ tiên của nó, và điều này phá vỡ sự đóng gói.

Dù bằng cách nào, giá cao hơn nhiều so với thêm tiền tố vào biến mẫu. Đối với các biến lớp và toàn cục, các tình huống tương tự nhau.

0

Cho phép xem xét một ví dụ:

def foo 
    10 
end 

p foo 
#=> 10 
foo = 'hi' 
p foo 
#=> hi 
p foo() 
#=> 10 

Nếu chúng ta định nghĩa một biến địa phương có tên là giống như tên phương pháp trong phạm vi tương tự, sau đó, chúng ta mất đi sự liên kết với tên phương pháp như tên biến được ưu tiên. Để định hướng, một người sẽ sử dụng dấu ngoặc đơn.

Cuốn sách này dường như để xây dựng về hiện tượng này, và quyết định thiết kế thực hiện để cung cấp sự linh hoạt trong đó một nhu cầu sử dụng biểu tượng như @ để xác định các biến Ví dụ để các phương pháp accessor tương ứng (var & var=) có thể được gọi mà không cần ngoặc, và người ta có ấn tượng rằng người ta đang truy cập biến, mặc dù trong thực tế người ta đang gọi một phương thức.

...bạn sẽ thấy các ký tự dấu chấm ở đầu của biến Ruby tên: biến toàn cục được bắt đầu bằng $, các biến mẫu là bắt đầu bằng @ và các biến lớp được bắt đầu bằng @@. Các tiền tố này có thể mất nhiều thời gian để sử dụng, nhưng sau một thời gian, bạn có thể đến để đánh giá cao thực tế là tiền tố cho bạn biết phạm vi của biến số . Các tiền tố được yêu cầu để phân biệt cú pháp ngữ pháp rất linh hoạt của Ruby . Một cách để suy nghĩ về tiền tố biến là chúng là một giá mà chúng tôi phải trả để có thể bỏ qua các dấu ngoặc đơn xung quanh các lời gọi phương thức .

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