2013-02-18 17 views
5

Mam niektóre klasy Scala i obiekty, w ich własnych pakietów. Każdy pakiet posiada obiekt pakiet określający pewne implicits, więc na przykład import com.foo.bar._ importuje wszystkie implicits i klas z pakietu barScala import wielu pakietów

Co chciałbym wiedzieć, czy istnieje sposób zdefiniować „parasolowe” import, powiedzmy com.foo.all tak, że

import com.foo.all._ 

jest równoważna

import com.foo.bar._ 
import com.foo.baz._ 
import com.foo.qux._ 
... 

mogę zrozumieć, że może to być trochę niejasne, ale jeśli weźmiemy pod uwagę przypadek, w którym mam wiele własnych pakietów byłoby to wyraźnie bardziej zwięzłe.

Odpowiedz

10

Najkrótsza forma mogę wymyślić to:

import com.foo._, bar._, baz._, qux._ 

Na przykład:

import scala.collection.mutable._, PriorityQueue._, ArrayBuffer._ 

EDIT

Może chcesz używać tylko pewne szczególne rzeczy, as @alex23 pointed out, więc możesz napisać:

import com.foo.{foo, bar, baz}, bar._, baz._, qux._ 
7

Sposób Scala importować wiele klas/obiektów z tego samego pakietu jest:

import scala.collection.immutable.{Map, HashMap, etc} 

Chłodny Scala tylko trick: aliasing/zmiana nazwy

import java.util.{Collection => JavaCollection} 
+0

IMO, @paulmdavies chce importować nie tylko mapa, HashMap i tak dalej, ale również zawartość nich. –

+0

Należy pamiętać, że podczas importowania, powiedzmy, 'collection.mutable.ArrayBuffer._' importowane nazwy są tylko tymi z' object ArrayBuffer'. Możesz importować członków klasy, ale tylko z określonej instancji. –

1

Obecnie nie można zrobić to trywialnie, ale może przyjść całkiem blisko z pewnym wysiłkiem.

Jeśli utworzysz package object all i ustawisz aliasy typów dla każdej klasy w innych pakietach i utworzysz metody przekazywania dla każdej metody (jeśli pozostałe są obiektami pakietu), to import wykona to, co chcesz.

Było kilka dyskusji na temat export feature, które uczyniłyby to znacznie łatwiejszym, ale nie jest to nawet konkretna propozycja, a tym bardziej wdrożona.

W każdym razie, nie trzeba powtarzać import kółko:

import com.foo.bar._, com.foo.baz._, ... 

ale wszystkie sposoby, aby skrócić listę dalej nie robią dokładnie to samo (np zaimportuje nazwę bar sama w sobie, nie tylko jej zawartość - może to nie być dla Ciebie problemem, ale warto o tym wiedzieć).

To powiedziawszy, dopóki nie pojawi się mechanizm eksportu, twój kod będzie maksymalnie czytelny i możliwy do utrzymania, jeśli wszystko napiszesz we własnym wierszu. O wiele trudniej jest zauważyć brakujące lub dodatkowe, gdy wszystko jest zablokowane na jednej linii.

0

Jeśli bar._, baz._, qux._ stanowić wszystko com.foo niż można po prostu zrobić com.foo._

Powiązane problemy