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?
Trả lời
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.
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 .
- 1. Tại sao C++ cho phép chúng ta bao quanh tên biến trong dấu ngoặc đơn khi khai báo một biến?
- 2. Tại sao JavaScript không cho phép bạn gọi trực tiếp các phương thức trên số?
- 3. Dấu nháy đơn hoặc dấu ngoặc kép cho phép nối biến đổi?
- 4. Tại sao PHP cho phép gọi các phương thức riêng tư từ các phiên bản khác?
- 5. Tại sao GNU Smalltalk sử dụng dấu ngoặc vuông cho các đối tượng phương thức?
- 6. Tiền tố cho các phương pháp thử nghiệm trong Đơn vị: "test" vs "should"
- 7. Xóa văn bản trong dấu ngoặc đơn (dấu ngoặc đơn trong dấu ngoặc đơn)
- 8. Biến cục bộ tĩnh cho các phương thức trong Ruby?
- 9. groovy: sử dụng dấu ngoặc đơn trên các cuộc gọi phương thức hay không?
- 10. Xóa các dấu ngoặc đơn trong json?
- 11. Tại sao các phương thức trong tài liệu Ruby trước bằng một dấu băm?
- 12. Tại sao các dòng mới trong ngoặc đơn thay đổi kết quả số học?
- 13. Tại sao StyleCop đề xuất phương thức tiền tố hoặc cuộc gọi thuộc tính bằng "this"?
- 14. Tại sao dấu chấm than được sử dụng trong các phương thức của Ruby?
- 15. Buộc dấu ngoặc đơn ngay cả khi gọi các hàm không tham số trong VB.NET?
- 16. Bỏ dấu ngoặc nhọn cho một băm trong mảng
- 17. Tại sao CMake tiền tố dấu cách với dấu gạch chéo ngược khi thực thi lệnh?
- 18. Hiểu của Ruby biểu tượng như lời gọi phương thức
- 19. Phần nào của chuẩn C++ cho phép khai báo biến trong dấu ngoặc đơn?
- 20. Tại sao các biến tĩnh không cho phép đệ quy?
- 21. Tại sao cuộc gọi lambda Ruby 1.9 có thể không có dấu chấm ở trước dấu ngoặc đơn?
- 22. Tại sao việc gọi một phương thức tĩnh được bảo vệ trong các lớp dẫn xuất được cho phép?
- 23. Biểu thức chính quy cho phép số, dấu cách, dấu cộng, dấu gạch nối và dấu ngoặc đơn
- 24. Emacs ruby-mode, thụt vào bên trong dấu ngoặc đơn?
- 25. Tại sao C# yêu cầu dấu ngoặc đơn khi sử dụng các giá trị rỗng trong một biểu thức?
- 26. Tại sao các tuples được đính kèm trong dấu ngoặc đơn?
- 27. Tại sao các cuộc gọi lại ActiveRecord yêu cầu các biến mẫu hoặc các phương thức thể hiện được bắt đầu bằng từ khóa tự?
- 28. Tại sao có hai bộ đối số/dấu ngoặc đơn trong định nghĩa phương thức Scala này?
- 29. Ruby chuyển đổi dấu nháy đơn thành dấu ngoặc kép trong XML
- 30. Các cuộc gọi phương thức trong EL
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
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
@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