2011-07-05 42 views
6

Tôi đang làm việc trên thư viện phụ thuộc vào Scala 2.9 nhưng chỉ cho một tính năng nhỏ. Tôi muốn đề xuất phiên bản tương thích với 2.8, nhưng tôi không muốn duy trì hai chi nhánh mã. Vì tôi đang sử dụng SBT, tôi muốn hưởng lợi từ các tính năng biên dịch chéo.Biên soạn có điều kiện tại Scala

Tuy nhiên tôi không biết có cách nào để cung cấp một trình biên dịch có điều kiện tương đương, chỉ bao gồm một đoạn mã nếu Scala 2.9 được sử dụng. Phản xạ có thể là một lựa chọn (nhưng làm thế nào?).

Chỉnh sửa: Các tính năng tôi đang sử dụng trong 2.9 là đối tượng gói sys mới.

Trả lời

2

tôi đã nhận nó với sự phản ánh. Vì vậy, nếu tôi muốn nhận được sys.SystemProperties, tôi có thể làm:

try { 
    val k = java.lang.Class.forName("scala.sys.package$") 
    val m = k.getMethod("props") 
    // etc. 
} catch { 
    case _ => throw new UnsupportedOperationException("Only available with Scala 2.9") 
} 

Nhưng nó là như vậy nhàm chán và xấu xí mà tôi nghĩ rằng tôi sẽ thả những tính năng ...

+0

Bạn không nên bắt những thứ như 'NoSuchMethodException'? –

+0

Tôi bắt tất cả mọi thứ vì tất cả các bước phản xạ có thể dẫn đến ném ngoại lệ. – paradigmatic

+0

Đủ công bằng. Khi thực hiện loại công cụ đó, tôi thường bỏ qua 'InvocationTargetException' để làm cho nó trong suốt hơn. –

1

đã đọc bài viết trên blog này, trong đó mô tả làm thế nào để làm điều đó với lập trình meta:

http://michid.wordpress.com/2008/10/29/meta-programming-with-scala-conditional-compilation-and-loop-unrolling/

+0

Merci! Nhưng kể từ khi tôi tham khảo mã mà không tồn tại trong Scala 2,8 (xem chỉnh sửa), nó sẽ không biên dịch. – paradigmatic

+0

Oh. Thật vậy, nó sẽ không làm việc với kỹ thuật này ... –

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