2016-09-22 38 views
5

Kotlin có tuyệt vời type safe builders mà làm cho có thể tạo ra của dsl nhưLàm cách nào để các nhà xây dựng an toàn kiểu Kotlin làm việc tại Scala?

html { 
    head { 
    title("The title") 
    body {} // compile error 
    } 
    body {} // fine 
} 

khiếp sợ này là bạn không thể đặt thẻ ở những nơi không hợp lệ, giống như cơ thể bên trong đầu, tính năng tự động hoàn thành cũng làm việc đúng cách.

Tôi quan tâm nếu điều này có thể đạt được ở Scala. Làm thế nào để có được nó?

Trả lời

1

Nếu bạn quan tâm đến việc xây dựng html, thì có một thư viện scalatags sử dụng khái niệm tương tự. Đạt được loại nhà xây dựng này không cần bất kỳ cấu trúc ngôn ngữ cụ thể nào. Dưới đây là ví dụ:

object HtmlBuilder extends App { 
    import html._ 
    val result = html { 
     div { 
      div{ 
       a(href = "http://stackoverflow.com") 
      } 
     } 
    } 
} 

sealed trait Node 
case class Element(name: String, attrs: Map[String, String], body: Node) extends Node 
case class Text(content: String) extends Node 
case object Empty extends Node 

object html { 
    implicit val node: Node = Empty 
    def apply(body: Node) = body 
    def a(href: String)(implicit body: Node) = 
     Element("a", Map("href" -> href), body) 
    def div(body: Node) = 
     Element("div", Map.empty, body) 
} 

object Node { 
    implicit def strToText(str: String): Text = Text(str) 
} 
+0

thẻ mở rộng không đáp ứng yêu cầu về an toàn loại. – Yaroslav

+0

@Yaroslav Vâng, bạn nói đúng. Và nó không có vẻ là một cách để làm cho api gọn gàng, ít nhất là cho bây giờ. Một số ngày sẽ có Dotty với các loại hàm ngầm định http://dotty.epfl.ch/blog/2016/12/05/implicit-function-types.html#how-to-remove-boilerplate. Họ sẽ làm chính xác những gì bạn cần. –

+0

@Yaroslav có thêm một lib gọi là sung sướng https://github.com/propensive/rapture. Và bạn có thể triển khai các mẫu an toàn loại. Các tài liệu là tinh khiết nhưng nó hoạt động. Dưới đây là ví dụ về trang web https://github.com/propensive/contextual-web/blob/master/src/main/scala/main.scala –

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