2011-10-08 30 views
22

Tôi hiện đang thực hiện các bước đầu tiên của mình ở Scala vì vậy tôi đang tìm các phương pháp hay nhất trong việc tiếp cận các vấn đề phổ biến. Sau đây là mã không hoạt động nhưng nó mô tả những gì tôi muốn làm. Bạn có thể đề nghị cách tiếp cận tốt nhất cho vấn đề này không?Mô hình chuỗi Scala phù hợp với thực hành tốt nhất

def resolveDriver(url: String) = { 
    url match { 
     case url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver" 
     case url.startsWith("jdbc:postgresql:") => "org.postgresql.Driver" 
     case url.startsWith("jdbc:h2:") => "org.h2.Driver" 
     case url.startsWith("jdbc:hsqldb:") => "org.hsqldb.jdbcDriver" 
     case _ => throw new IllegalArgumentException 
    } 
    } 
+2

Xem thêm [câu hỏi này] (http://stackoverflow.com/q/7586605/53013) cho một cách khác để giải quyết vấn đề này, nếu phần phù hợp xảy ra là toàn bộ giao thức. –

Trả lời

39

Về mặt cú pháp, bạn có thể sửa đổi một chút xíu gì bạn báo cáo trường hợp:

case url if url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver" 

này chỉ đơn giản là liên kết với các giá trị url vào biểu mẫu (mà cũng là url) và thêm một người bảo vệ biểu hiện với một thử nghiệm. Điều đó sẽ làm cho việc biên dịch mã.

Để làm cho nó hơn một chút scala giống như, bạn có thể trở lại một lựa chọn [Chuỗi] (Tôi đã gỡ bỏ một vài điều khoản kể từ khi nó chỉ mang tính minh họa):

def resolveDriver(url: String) = url match { 
    case u if u.startsWith("jdbc:mysql:") => Some("com.mysql.jdbc.Driver") 
    case u if u.startsWith("jdbc:postgresql:") => Some("org.postgresql.Driver") 
    case _ => None 
} 

Đó là trừ khi bạn muốn quản lý ngoại lệ.

+0

Cảm ơn! Đó chính xác là những gì tôi đang tìm kiếm! Tôi rất vui vì tôi đã đặt câu hỏi 'vì tôi đã chuẩn bị sẵn sàng để tạo ra một lớp vỏ cho điều đó, có mùi như một sự quá mức. Ngoài ra tôi cảm ơn bạn đã sửa tôi về ném ngoại lệ. –

10

Đây là một cách thay thế. Lưu trữ tất cả ánh xạ trên bản đồ và sau đó sử dụng phương thức collectFirst để tìm kết quả phù hợp. Loại chữ ký của collectFirst là:

def TraversableOnce[A].collectFirst[B](pf: PartialFunction[A, B]): Option[B] 

Cách sử dụng:

scala> val urlMappings = Map("jdbc:mysql:" -> "com.mysql.jdbc.Driver", "jdbc:postgresql:" -> "org.postgresql.Driver") 
urlMappings: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(jdbc:mysql: -> com.mysql.jdbc.Drive 
r, jdbc:postgresql: -> org.postgresql.Driver) 

scala> val url = "jdbc:mysql:somestuff" 
url: java.lang.String = jdbc:mysql:somestuff 

scala> urlMappings collectFirst { case(k, v) if url startsWith k => v } 
res1: Option[java.lang.String] = Some(com.mysql.jdbc.Driver) 
+0

Cảm ơn nhưng không phải là những gì bạn đề xuất một trừu tượng hơn 'match'? –

+0

@mojojojo: Không hoàn toàn. Tập hợp các biểu thức 'case' theo sau' match' tạo thành một 'PartialFunction'. 'collectFirst' là một phương thức chấp nhận một' PartialFunction', lặp qua bộ sưu tập và trả về kết quả khớp đầu tiên được tìm thấy như được gói trong 'Some'. (trả về 'Không có' nếu không tìm thấy kết quả phù hợp.) – missingfaktor

+0

@mojojojo: Xem nguồn: http://goo.gl/Q4UNz – missingfaktor

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