2016-09-08 20 views
9

Trong dự án Scala của tôi, hầu hết các tác phẩm của tôi có những hàng nhập khẩu:nhập khẩu Bundle trong Scala

import eu.timepit.refined._ 
import eu.timepit.refined.api.Refined 
import eu.timepit.refined.auto._ 
import eu.timepit.refined.numeric._ 

import spire.math._ 
import spire.implicits._ 

import com.wix.accord._ 
import com.wix.accord.dsl._ 

import codes.reactive.scalatime._ 

import better.files._ 

import java.time._ 

import scala.collection.mutable 
... 
... 

cách tốt nhất để KHÔ này trong Scala là gì? Tôi có thể chỉ định tất cả chúng cho dự án của tôi (sử dụng một số loại sbt plugin?) Hoặc ở cấp gói?

Trả lời

6

Tôi đã thấy một số phương pháp tiếp cận giải quyết những gì bạn đang tìm kiếm. Kiểm tra

nhập khẩu được xác định

https://github.com/mongodb/casbah/blob/master/casbah-core/src/main/scala/Implicits.scala

dụ nhỏ của phương pháp này:

object Imports extends Imports with commons.Imports with query.Imports with query.dsl.FluidQueryBarewordOps 

object BaseImports extends BaseImports with commons.BaseImports with query.BaseImports 

object TypeImports extends TypeImports with commons.TypeImports with query.TypeImports 

trait Imports extends BaseImports with TypeImports with Implicits 

@SuppressWarnings(Array("deprecation")) 
trait BaseImports { 
    // ... 
    val WriteConcern = com.mongodb.casbah.WriteConcern 
    // More here ... 
} 

trait TypeImports { 
    // ... 
    type WriteConcern = com.mongodb.WriteConcern 
    // ... 
} 

nhập khẩu sử dụng

https://github.com/mongodb/casbah/blob/master/casbah-core/src/main/scala/MongoClient.scala

Khi họ sử dụng đối tượng nhập này, nó sẽ mở khóa tất cả bí danh loại của bạn cho bạn. Ví dụ, WriteConcern

import com.mongodb.casbah.Imports._ 
// ... 
def setWriteConcern(concern: WriteConcern): Unit = underlying.setWriteConcern(concern) 

Về cơ bản họ quấn lên tất cả các hàng nhập khẩu vào một đối tượng nhập khẩu thông thường, sau đó chỉ cần sử dụng com.mycompany.Imports._ nhập khẩu

Doobie làm điều gì đó tương tự như nơi mà hầu hết người dùng cuối chỉ import doobie.imports._

https://github.com/tpolecat/doobie/blob/series/0.3.x/yax/core/src/main/scala/doobie/imports.scala

một lần nữa, một mẫu từ mô hình này:

object imports extends ToDoobieCatchSqlOps with ToDoobieCatchableOps { 
    /** 
    * Alias for `doobie.free.connection`. 
    * @group Free Module Aliases 
    */ 
    val FC = doobie.free.connection 

    /** 
    * Alias for `doobie.free.statement`. 
    * @group Free Module Aliases 
    */ 
    val FS = doobie.free.statement 

    // More here ... 
} 

Sự khác biệt chính trong cách tiếp cận này giữa kiểu đối tượng gói là bạn có quyền kiểm soát nhiều hơn đối với những gì/khi nào cần nhập. Tôi đã sử dụng cả hai mẫu, thường là một đối tượng gói cho các phương thức tiện ích phổ biến mà tôi sẽ cần qua một gói nội bộ. Và đối với các thư viện, cụ thể là người dùng mã của tôi, tôi có thể đính kèm một số định nghĩa ngầm định cho đối tượng nhập như trong số doobie được đề cập ở trên để mở khóa cú pháp DSL cho người dùng bằng một lần nhập.

+3

Đặt bí danh thành đối tượng gói com.acme, sau đó mỗi tệp là 'package com.acme; gói projectx'. Không cần nhập. –

+0

@BrianPendleton Tốt hơn nhiều, được thăng hạng! –

4

Tôi có lẽ sẽ đi với các scala.Predef approach: về cơ bản, bí danh các loại và phơi bày các đối tượng tôi muốn làm cho có sẵn. Vì vậy, ví dụ:

package com.my 

package object project { 
    type LocalDate = java.time.LocalDate 
    type LocalDateTime = java.time.LocalDateTime 
    type LocalTime = java.time.LocalTime 

    import scala.collection.mutable 

    type MutMap[A, B] = mutable.Map[A, B] 
    val MutMap = mutable.Map 
    // And so on.... 
} 

Bây giờ, bất cứ nơi nào bạn bắt đầu tệp với package com.my.project, tất cả những điều trên sẽ tự động có sẵn. Btw, kudo cũng đến @ som-snytt cho pointing this out.

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