2013-11-12 3 views
1

мне нужно использовать неявный порядок, который был определен в объекте в файлеScala импортировать файл во всех файлах пакета

abc 

следующим образом:

object abc{ 
implicit def localTimeOrdering: Ordering[LocalDate] = Ordering.fromLessThan(_.isBefore(_)) 
} 

Так я сделать объект пакета

хуг

внутри файла «package.scala», что в свою очередь, находится в пакете 'xyz', в котором есть файлы, в которых мне нужно, чтобы неявное упорядочение применимо. Я пишу примерно так:

package object xyz{ 
import abc._ 
} 

Это не работает. Если я вручную напишу неявный оператор определения внутри объекта пакета, он отлично работает. Каков правильный способ импорта объекта (abc), чтобы все его объекты/классы/определения могли использоваться во всем пакете «xyz»?

ответ

3

Вы не можете импортировать implicit преобразования таким образом, вам придется:

вручную записать их внутри объекта:

package obj { 
    implicit def etc// 
} 

Или получить их через наследование/Mixins:

package obj extends SomeClassOrTraitWithImplicits with AnotherTraitWithImplicits { 
} 

По этой причине, как правило, вы определяете свои implicit конверсий в traits или class Таким образом, вы можете делать массовый импорт с помощью одного package object.

Обычный шаблон для определения помощника trait для каждого случая.

trait SomeClass { 
    // all the implicits here 
} 
object SomeClass extends SomeClass {} 

Делая это позволю вам:

package object abc extends SomeClass with SomeOtherClass with AThirdClass { 
// all implicits are now available in scope. 
} 
+0

Опираясь на ваш ответ, это всегда хорошая практика, чтобы положить implicits в черте, а затем вы можете иметь объект компаньона продлить его: 'черты а { implicit def ...} 'и' object abc extends abc'. Таким образом вы можете импортировать его: 'import abc._' и смешать implicits в другом классе:' object obj extends abc'. Таким образом, вы получаете всю гибкость, которая вам когда-либо понадобится. –

Смежные вопросы