2012-09-06 24 views
8

Tôi có một chương trình với rất nhiều boilerplate (đó là, đáng buồn, không thể giảm ngay cả bởi cơ chế Scala). Nhưng nếu có một cách để tạo ra các lớp cấp cao phức tạp với một macro, tất cả các bản mẫu đó sẽ biến mất. Ví dụ:Có thể tạo một số lớp cấp cao nhất với một lời gọi macro trong scala 2.10 không?

package org.smth 

generate(params) 

// becomes 

class A { ... } 
object B { ... } 
case class C { ... } 

Có thể sử dụng macro Scala 2.10 không?

Trả lời

7

Tóm lại: không.

Macro types (tức là các macro tạo loại thay vì phương pháp) được lên kế hoạch, nhưng chúng không được thiết kế và chỉ định, chưa được triển khai và chúng sẽ không có giá 2,10.

Ngoài ra, một lời gọi macro đơn lẻ chỉ có thể tạo ra một loại duy nhất. Tuy nhiên, vì các loại (cụ thể là object s) có thể được lồng nhau, đây không phải là giới hạn: bạn chỉ có thể tạo một cấp cao nhất object chứa tất cả các lớp bạn cần. Sự khác biệt giữa điều này và mã của bạn về cơ bản là một bổ sung import tuyên bố:

package org.smth 

type O = Generate(params) 

// becomes 

object O { 
    class A { ... } 
    object B { ... } 
    case class C { ... } 
} 

// which means you need an additional 

import O._ 

Họ nghĩ về package macro có thể tạo ra toàn bộ các gói đầy đủ các lớp học, nhưng nhận ra rằng kể từ object s là một superset của package s và loại macro có thể tạo ra object mà không cần thiết.

+1

Nhưng có thể tạo các lớp bên trong trong macro phương thức ngay bây giờ không? Giống như 'val a = {class A {...}; new A smth} '? – Rogach

+2

Có thể, nhưng các lớp địa phương không cần phải được đăng ký trong một bảng ký hiệu toàn cầu, vì vậy nó đơn giản. –

+1

Bất kỳ ví dụ mã/gist nào? – ZiglioUK

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