Có thể tạo đối tượng mà không khai báo lớp không? Giống như trong JavaScript obj = {a: '1'}; console.log(obj.a)
Có thể tạo đối tượng mà không khai báo lớp không?
Trả lời
Trong Groovy, bạn phải luôn cung cấp lớp của đối tượng được tạo, do đó không có cú pháp ngữ nghĩa của Groovy với JavaScript.
Tuy nhiên, Groovy có cú pháp ngữ cho một số Map
, khái niệm rất giống với đối tượng JavaScript, tức là cả hai tập hợp thuộc tính hoặc cặp tên-giá trị.
Mã Groovy tương đương với JavaScript trên là:
def obj = [a: '1']
println obj.a
Mặc dù không có tên lớp sử dụng ở đây bạn vẫn đang tạo ra một đối tượng của một lớp học đặc biệt (java.util.LinkedHashMap
). Đoạn mã trên chỉ là viết tắt cho:
def obj = new LinkedHashMap();
obj.a = '1'
println obj.a
các Expando
class có lẽ thậm chí tương tự như một đối tượng JavaScript, và rất hữu ích khi bạn muốn tránh những "chi phí" xác định một lớp học, hoặc muốn có một đối tượng động bất kỳ thuộc tính tùy ý nào có thể được thêm vào khi chạy.
Hơi ngạc nhiên khi không ai đề cập đến lớp Expando. Điều này bổ sung thêm chức năng trên bản đồ để bạn có thể tham chiếu trực tiếp các thuộc tính trong các hàm của mình. Ví dụ mã bên dưới.
def expando = new Expando(a:"def")
expando.run = {def b ->
println("$a")
println("$b")
}
expando.run("ABC")
def map = [a:"def"]
map.run = {def b ->
println("$a") //THIS DOES NOT WORK. You will get a missing property exception.
println("$b")
}
map.run("ABC")
sản lượng in:
def
ABC
groovy.lang.MissingPropertyException
ABC (nếu bạn nhận xét ra println ($ a) trong map.run , println ($ b) in ra ABC)
Bỏ qua các ngắt dòng thừa trong đầu ra. Đã có một heck của một thời gian đặt def và ABC trên dòng liên tiếp.
chỉnh sửa: Api liên kết
Tìm thấy tuyệt vời! Ông Haki nổi tiếng cũng đã viết về lớp Expando: http://mrhaki.blogspot.com/2009/10/groovy-goodness-expando-as-dynamic-bean.html Tôi có thể nói rằng lớp Expando thực sự là câu trả lời cho những gì đã được hỏi. – Henrik
- 1. Có thể khai báo một lớp mà không cần triển khai nó không? (C++)
- 2. Chuyển tiếp shared_ptr mà không khai báo lớp
- 3. Có thể lấy chuỗi tên thuộc tính đối tượng mà không tạo đối tượng đối tượng không?
- 4. Không có tên đối số trong khai báo trừu tượng?
- 5. IllegalArgumentException: đối tượng không phải là một thể hiện khai báo lớp
- 6. Có thể tạo một đối tượng không có lớp trong C# không?
- 7. Khai báo đối tượng lớp trong tệp tiêu đề
- 8. Làm thế nào để có được loại lớp mà không cần khởi tạo đối tượng?
- 9. Gọi hàm từ tệp Lớp mà không tạo đối tượng của lớp đó
- 10. khai báo thuộc tính làm đối tượng?
- 11. Có tệ không khi khai báo một lớp học trống?
- 12. Có thể tạo một thể hiện của một đối tượng trong Java mà không cần gọi hàm tạo không?
- 13. Tạo đối tượng trong Symfony2 mà không cần Doctrine
- 14. Có thể tạo đối tượng CLHeading trong Objective C không?
- 15. Khai báo một đối tượng ngay cả trước khi lớp đó được tạo ra
- 16. Khai báo mảng đối tượng chứa đối tượng
- 17. Phản ánh Java - Đối tượng không phải là trường hợp khai báo lớp
- 18. "Bạn không thể chuyển tiếp các lớp khai báo mà toán tử quá tải &"?
- 19. Có thể tạo một thể hiện của một lớp mà không cần chạy bất kỳ mã nào từ lớp không? (không có ctor, không có khởi tạo trường)
- 20. khai báo lớp trừu tượng trong C++
- 21. “Không thể khởi tạo lớp trừu tượng ... với các phương pháp trừu tượng” trên lớp học mà không cần phải có bất kỳ phương pháp trừu tượng
- 22. Không thể tạo đối tượng CLLocation
- 23. Khai báo lớp PHP
- 24. sử dụng bình phương sqlalchemy mà không có cơ sở khai báo lớp con
- 25. lớp khai báo bên trong đóng cửa vs lớp chuẩn mà không đóng cửa
- 26. Tôi có thể tạo đối tượng cho giao diện không?
- 27. Có thể khởi tạo lớp Ruby mà không gọi khởi tạo không?
- 28. Việc tạo một thể hiện của một lớp con có tự động tạo đối tượng siêu lớp của nó không?
- 29. PHP có thể khởi tạo một đối tượng từ tên của lớp dưới dạng chuỗi không?
- 30. Có thể tạo một lớp Repository chung cho tất cả các đối tượng của tôi không?
bạn cũng có thể sử dụng cú pháp này để tạo ra một bản đồ trống: def obj = [:] – Hudson
Thú vị. Trong trường hợp một trong những bạn sẽ tự hỏi - nó được phép sử dụng mảng/danh sách bên trong 'LinkedHashMap'. Ví dụ. hoạt động này: 'def obj = [a: [1,2," foo "]]; obj.a.push ("bar") ' – Nux