2011-11-20 21 views
7

Với phương pháp chung register bên dưới, tôi muốn xác định toán tử := là một bí danh tượng trưng.Ký pháp ngắn nhất để xác định toán tử là bí danh phương thức trong Scala là gì?

def register[Prop <: Property[_]](prop: Prop): Prop 

@inline 
final def :=[Prop <: Property[_]] = register[Prop] _ 

Nguyên Tôi muốn viết một cái gì đó như thế này:

val := = register _ 

Nhưng điều đó mang lại cho tôi chức năng chữ ký Nothing => Nothing. Nỗ lực tiếp theo của tôi là để tham số hóa nó với các loại Prop nhưng điều đó dường như chỉ hoạt động nếu tôi làm cho nó một def, có thể lấy thông số loại và vượt qua chúng trở đi.

Lý tưởng nhất là tôi muốn bỏ chú thích @inline nhưng tôi không chắc chắn mã trình biên dịch Scala nào tạo ra nó.

Quan trọng nhất mục tiêu của tôi là nó không có phương pháp := lặp lại tất cả các phần của chữ ký register phương pháp của ngoại trừ tên và sau đó chỉ đơn giản là để cho các đại biểu cựu đến sau này.

Trả lời

2
def :=[Prop <: Property[_]](prop: Prop) = register(prop) 

sẽ hoạt động.

+0

Phái đoàn có chữ ký trùng lặp chính xác là những gì tôi muốn tránh. Xem đoạn cuối cùng của tôi "Quan trọng nhất ...". Ngoài ra tôi không muốn phải chuyển tiếp thủ công bất kỳ đối số nào. –

+0

@TimFriske Thật không may, bạn sẽ phải, nếu bạn muốn làm điều này. –

1

Tôi không tin rằng có bất kỳ cách nào để đạt được những gì bạn đang sau (về cơ bản những gì alias cung cấp cho bạn trong Ruby) trong Scala vì nó hiện đang đứng. Các autoproxy plugin là một nỗ lực để giải quyết loại vấn đề, nhưng nó không thực sự sẵn sàng cho sản xuất sử dụng được nêu ra do các vấn đề khác nhau với việc tạo mã trong trình biên dịch plugins.

1

Bạn có thể làm điều này:

def := : Prop => Prop = register 

Vì vậy, về cơ bản đây bạn xác định một chức năng của loại (Prop => Prop) mà chỉ tham chiếu chức năng khác.

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