2009-07-14 61 views
56

tôi đang học Scalalift cùng một lúc và tôi đã bị mắc kẹt trên sự hiểu biết cú pháp sử dụng để inintialize các SiteMap trong Boot.scala:Ý nghĩa của dấu hai chấm, dấu gạch dưới và dấu sao trong SiteMap của thang máy (mục: _ *) là gì?

val entries = Menu(Loc("Home", "/", "Home")) :: 
     Menu(Loc("Foo", "/badger", "Foo")) :: 
     Menu(Loc("Directory Foo", "/something/foo", "Directory Foo")) :: Nil 
LiftRules.setSiteMap(SiteMap(entries:_*)) 

gì chính xác là ý nghĩa của các tham số SiteMap? Tôi thấy rằng giá trị mục là danh sách Menu. dấu hai chấm, dấu gạch dưới, ngôi sao là gì? Lúc đầu, tôi nghĩ rằng đó là một phương pháp trong Danh sách, nhưng tôi không thể tìm thấy định nghĩa như vậy ...

+0

Đó thực sự là một câu hỏi khá hay. Tôi đặt cược rất nhiều người phải đối mặt với cùng một vấn đề, đó là, như bạn đã chỉ ra trong anwer của bạn, exarcebated bởi thiếu không gian giữa: và "_". –

+0

Câu hỏi rất hay. Tôi đã upvote nó nhiều lần nếu tôi có thể! – Ivan

Trả lời

72

OK, sau khi đồng nghiệp của tôi đề cập đến tôi, rằng ông đã gặp phải câu thần chú bí mật này trong cuốn sách Programming in Scala. tìm kiếm trong bản sao của tôi và tìm thấy nó được mô tả trong Mục 8.8 Tham số lặp lại. (Mặc dù bạn cần phải tìm kiếm với khoảng trống giữa ruột kết và gạch: - /) Có một câu để giải thích nó như:

... thêm đối số mảng với một dấu hai chấm và một biểu tượng _*, như thế này: scala> echo(arr: _*)

Ký hiệu này yêu cầu trình biên dịch chuyển mỗi phần tử echo, chứ không phải là đối số riêng lẻ.

Tôi tìm thấy description offered here hữu ích hơn.

Vì vậy x: _*như một tuyên bố loại mà nói với trình biên dịch để điều trị x như lặp đi lặp lại tham số (aka chiều dài thay đổi danh sách đối số - vararg).

+0

Vâng, đúng vậy. -) –

+1

Cảm ơn rất nhiều, anh bạn. Tôi ước gì tôi có thể tìm thêm những giải thích về loại hình này ở đây. – Ivan

+3

Vì vậy, nếu bạn đã quen thuộc với Python, gọi một hàm với * var làm điều gì đó tương tự: 'var = (1, 2, 3) def f (* args): cho arg trong args: in arg f (* var) ' Đó sẽ in: Vì vậy, rõ ràng là 'x: _ *' tương đương Scala để này. –

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