Tôi phải tích hợp một số macro trong một dự án đang sử dụng mẫu bánh. Mô hình đó cho phép chúng tôi tránh được hàng tỷ hàng nhập khẩu, trong số những lợi thế khác, vì vậy chúng tôi muốn giữ nó. Bây giờ, chúng tôi đang đối mặt với một vấn đề với một số macro thử nghiệm, chúng tôi đã thử nghiệm bên ngoài thân cây. Đầu tiên, chúng ta hãy thể hiện một hệ thống giả tên Cake:Có thể tích hợp Cake-Pattern và Macros không?
trait APiece {
class A
}
trait BPiece { this: APiece =>
def aMacro(a: A): Unit =() /* macro ??? */
}
trait CPiece { this: APiece with BPiece =>
def aMacroInvoker = aMacro(new A)
}
class Cake { this: APiece with BPiece with CPiece => }
mỗi người định nghĩa một lớp, BPiece được coi là một macro trong đó sử dụng các lớp mỗi người được xác định, và cuối cùng, CPiece gọi vĩ mô. Tôi nói rằng BPiece được cho là một vĩ mô vì tôi không thể viết mã cho việc triển khai nó. Tôi đã thử nhiều cách nhưng tôi luôn sụp đổ với các lỗi sau:
"macro implementation must be in statically accessible object"
Đọc macros code người ta có thể đoán rằng nó là neccesary gửi kèm macro trong một module tĩnh. Có cách nào để triển khai macro sử dụng cấu trúc hệ thống không?
Tôi không nghĩ rằng giải quyết vấn đề của mình, và tôi không nghĩ bất cứ điều gì sẽ xảy ra. Bản chất của mẫu bánh - như bạn nên biết! :-) - đang có thể chọn các lớp bạn muốn trong mã "khách hàng". Nếu 'Macro 'là tĩnh, bạn không thể chuyển đổi theo ý muốn. Bạn có thể chuyển đổi tệp nguồn hoặc tệp lớp, nhưng bạn không thể viết mã cho biết "điều này sẽ sử dụng macro từ đây và sẽ sử dụng macro từ đó". –
Tuyệt vời, tôi nghĩ rằng vấn đề mới sẽ nảy sinh, nhưng bây giờ tôi có thể tiếp tục với giải pháp này. Cảm ơn nhiều!Daniel, hệ thống của chúng ta sẽ không thực sự thuần khiết với các macro. Chúng tôi chỉ cho phép khách hàng quyết định xem anh ấy có muốn sử dụng chúng hay không. Vì vậy, tôi hy vọng điều này là đủ tốt. – jeslg
@ DanielC.Sobral Tôi mặc dù ý tưởng là tuyên bố một macro bên trong một chiếc bánh. Nếu bạn có các lớp khác nhau xác định các macro đề cập đến các triển khai macro khác nhau, bạn có thể chuyển đổi giữa các macro theo ý muốn và nhận được hành vi khác nhau. –