2014-06-30 16 views
5

Dưới đây là các mã từ một ví dụ:Scala Phun Routing Cú pháp

import spray.routing.SimpleRoutingApp 

object Main extends App with SimpleRoutingApp { 

     implicit val system = ActorSystem("my-system") 

     startServer(interface = "localhost", port = 8080) { 
      path("hello") { 
        get { 
        complete { 
         <h1>Say hello to spray</h1> 
        } 
       } 
      } 
     } 
} 

Tìm thấy tại http://spray.io/documentation/1.1-SNAPSHOT/spray-routing/#spray-routing

Xin hãy tha thứ noobiness của tôi, như tôi đến từ một nền tảng Java ... Tôi đang cố gắng để nhặt ngôn ngữ Scala cũng như khuôn khổ này cùng một lúc. Tôi ngữ nghĩa hiểu những gì đang xảy ra ở đây, nhưng cú pháp tôi rất bối rối.

Tôi muốn hiểu những gì các cấu trúc trong ngôn ngữ Scala được áp dụng ở đây, cụ thể bắt đầu từ cuộc gọi đến "startServer" và triển khai ở giữa {}. Bằng cách đó tôi có thể Google nó lên và nghiên cứu nó ... nhưng tôi không chắc chắn những gì để tìm kiếm ở đây. Tôi nghĩ rằng nó có thể liên quan đến một số khái niệm chức năng trong ngôn ngữ.

"startServer" có vẻ là một phương thức của SimpleRoutingApp, nhưng có vẻ như bạn đang chuyển các hàm lồng vào phần thân của nó, tức là "đường dẫn", "get", "complete" ... ? Cảm ơn vì sự giúp đỡ.

Trả lời

7

Phun không phải là điều dễ nhất để tìm hiểu, đặc biệt là khi bạn mới bắt đầu với Scala, nhưng tôi sẽ cố gắng giải thích.

Điều đầu tiên bạn cần hiểu là currying. Trong hai từ, hàm curried là hàm trả về một hàm khác. Vì vậy, startServer là một ví dụ điển hình của một hàm cà ri, ở đây nó rút ngắn chữ ký:

def startServer(interface: String, port: Int)(route: ⇒ Route): Future[Http.Bound] 

Đây là một cách để khai báo một hàm cà ri, startServer mất một máy chủ và một cổng, sau đó "trở lại" một chức năng mà mất của bạn dịch vụ route và trả về tương lai với Http.Bound. Mẹo tiếp theo được cho phép trong Scala, là bạn có thể viết một danh sách arg trong dấu ngoặc nhọn như {} và được sử dụng trong startServer, danh sách arg đầu tiên chứa hai tham số bắt buộc, vì vậy bạn không thể sử dụng kiểu {}(), nhưng khi bạn vượt qua host:port, bạn có chức năng Route => Future[Http.Bound], vì vậy bạn có thể áp dụng kiểu này. Và quy tắc này có thể được áp dụng thêm (với path, get, complete).

Những gì bạn có bên trong, tức là

path("hello") { 
    get { 
     complete { 
      <h1>Say hello to spray</h1> 
     } 
    } 
} 

là dịch vụ thực tế của bạn Route. Nó bao gồm cái gọi là directives, được dựa trên việc thực hiện không có khả năng của HList (tôi sẽ không giải thích nó ở đây, nhưng bạn có thể tìm thấy thông tin trên mạng). Nói chung, mỗi chỉ thị là một hàm thực hiện điều gì đó với người dùng HttpRequest (về cơ bản là RequestContext). Mô tả cho tất cả các chỉ thị có thể được tìm thấy here.

+0

Cảm ơn sự giúp đỡ! Bạn có thể chỉ cho tôi một số tài liệu về đường cú pháp mà trong đó một phương pháp danh sách arg có thể được áp dụng với {} thay vì()? Cảm ơn! – HiChews123

+1

@ acspd7 [từ sách Scala] (http://books.google.ru/books?id=MFjNhTjeQKkC&pg=PA171&lpg=PA171&dq=Scala+one+arg+list+curly+braces&source=bl&ots=FMli-HHKvu&sig=-tX8a0dLvpaRxp_CSX6D4y11KvY&hl= ru & sa = X & ei = NZi9U6iVCsG8ygOPtoLQBA & ved = 0CEgQ6AEwBA # v = onepage & q = Scala% 20one% 20arg% 20list% 20curly% 20braces & f = false) – 4lex1v

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