2013-08-28 26 views
11

Tôi có sau vĩ mô xác định một lớp học và trở về một thể hiện của lớp đó (với Scala 2.10.2 và các plugin vĩ mô):Phương pháp không thể được truy cập trong lớp tạo Macro

def test[T] = macro testImpl[T] 

def testImpl[T : c.WeakTypeTag](c: Context): c.Expr[Any] = { 
    import c.universe._ 
    val className = newTypeName("Test") 

    c.Expr { q""" 
    class $className { 
     def method = 1 
    } 
    new $className 
    """} 
} 

Khi tôi gọi là vĩ mô :

case class Cat(name: String) 

val t = test[Cat].method 

tôi nhận được lỗi sau:

method method in class Test cannot be accessed in Test 
val t = test[Cat].method 
       ^

mục tiêu tổng thể của tôi là sử dụng vampire methods và sử dụng dấu ngoặc kép để mô tả lớp được tạo. Làm thế nào tôi có thể giải quyết lỗi này?

+0

Lớp học tổng hợp của bạn có thể mở rộng một đặc điểm xác định 'phương thức' trừu tượng không? –

+0

Không vì tôi cần phải tạo các phương thức đó với tên cụ thể. Và khi cố gắng làm điều đó tôi nhận ra rằng tôi thậm chí không thể truy cập các phương thức không được tạo ra. Tôi nghi ngờ rằng tôi không sử dụng dấu ngoặc kép đúng cách ở đây. – Eric

+0

Tôi không có ý tưởng rằng bây giờ đã có một plugin trình biên dịch cho thiên đường vĩ mô (như trái ngược với bị buộc phải sử dụng một trình biên dịch chia hai). Nếu chỉ cho việc học đó, cảm ơn rất nhiều cho câu hỏi của bạn. –

Trả lời

10

Trong bài đăng của tôi về phương pháp ma cà rồng, tôi đề cập đến this workaround cho this bug. Đối với một số lý do bạn hiện không thể nhìn thấy các phương thức của lớp ẩn danh trên cá thể được trả về từ macro trừ khi bạn tạo một lớp bao bọc mở rộng lớp với các phương thức và trả về một cá thể của lớp đó.

Bạn đang nhìn thấy cùng một lỗi từ một góc hơi khác. Bạn đã đặt tên cho lớp này bằng các phương thức mà bạn muốn xem trên kiểu cấu trúc của cá thể trả về, nhưng bạn vẫn cần một trình bao bọc. Sau đây sẽ làm việc:

c.Expr { q""" 
    class $className { 
     def method = 1 
    } 
    new $className {} 
    """} 

Lưu ý rằng tất cả tôi đã làm là thêm một cặp dấu ngoặc vào dòng tạo ra ví dụ, vì vậy mà tôi có được một thể hiện của một lớp vô danh mở rộng $className thay vì chỉ một $className.

Tôi không biết đằng sau lỗi này là gì và tôi không chắc liệu Eugene có biết nhiều hơn không. Gần đây tôi đã xác nhận rằng nó vẫn còn trong bản xây dựng mới nhất của 2.11.

+1

Tôi sẽ đưa điều này vào cuộc họp phản ánh tiếp theo. –

+1

Tôi biết bạn sẽ bước vào Travis. Cảm ơn! Bây giờ tôi có thể chuẩn bị câu hỏi tiếp theo :-) – Eric

+1

Hình như nó là do thiết kế. Theo Martin, cho phép các thành viên ngay lập tức của các lớp học địa phương kết thúc trong các loại cấu trúc dẫn đến một số vấn đề lạ trở lại sau đó, đó là lý do tại sao bây giờ người ta phải đi thêm dặm để lộ những thành viên này. –

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