Scalatypes关键字:如何在多个类中使用它

在编写Haskell之后回到Scala,我已经开始使用type关键字来使我的类定义更具可读性,例如:

type RestfulParams = Map[String, String] def canonicalize(params: RestfulParams): String = { ... } 

我遇到的麻烦是这些types定义需要在类或对象内部生存 – 它们不像“Haskell”中的“头等公民”。 如果我尝试在一个类或对象之外定义一个types,我得到一个编译器expected class or object definition

我的问题是如何跨包中的多个类和对象使用这些types? 我现在所做的事似乎很难看:

 object RestfulTypes { type RestfulParams = Map[String, String] etc } 

然后在另一个类文件中:

 import utils.{RestfulTypes => RT} def get(resource: String, params: RT.RestfulParams): String = { ... } 

有没有更好的方式做到这一点 – 顺便说一句,斯卡拉大师认为只能在类/对象中定义types是好事还是坏事?

包对象是否适合你?

从文章:

直到2.8之前,唯一可以放在软件包中的东西就是类,特性和独立对象。 这是迄今为止最常见的定义,放在一个包的顶层,但Scala 2.8并不仅限于这些。 你可以把任何types的定义放在一个类中,也可以放在一个包的顶层。 如果你有一些帮助方法,你希望在整个包的范围内,那就把它放在包的顶层。 为此,请将定义放入包对象中。 每个包允许有一个包对象。 放置在包对象中的任何定义都被认为是包本身的成员。

包对象scala已经有很多types和值,所以我认为你可以使用相同的技术为你自己的types。

我不确定在这种情况下什么是好的,但有两种select:

使用一个特质:( 斯卡拉的无私特质模式 )

 trait RestfulTypes { type Params = Map[String,String] //... } object MyRestService extends RestService with RestfulTypes { /* ... */ } 

或者只是导入对象的成员,有效地使用它像一个包:

 import util.RestfulTypes._ 

你可以使用一个包对象,并把types声明在那里。 当您导入该包时,types定义将可用。

一个例子 :

 //package myType package object myType {type mine = List[String]} 

请注意,包对象与包的名称相同,以便可以在没有对象前缀的情况下使用,例如myType.mine如果用不同的名称命名它,例如:

 //package myType package object mainType {type mine = List[String]} 

它可以通过mainType.mine访问,当你导入“包”

欲了解更多信息: http : //www.scala-lang.org/docu/files/packageobjects/packageobjects.html