Scala type 关键字: 如何最好地跨多个类使用它

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

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

我遇到的麻烦是,这些类型定义需要存在于一个类或对象中——它们不像在哈斯克尔那样是“一等公民”。如果我尝试在类或对象之外定义一个类型,我会得到一个编译器 expected class or object definition

那么,我的问题是如何在一个包中的多个类和对象之间使用这些类型?我现在的所作所为似乎相当丑陋:

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

然后在另一个类文件中:

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

有没有更好的方法来做到这一点——顺便问一下,Scala 专家认为只能在类/对象中定义类型是好事还是坏事?

27782 次浏览

包对象适合你吗?

摘自文章:

在2.8版本之前,你能放进包里的只有类、 trait 和独立对象。到目前为止,这些是放在包顶层的最常见的定义,但是 Scala 2.8并不仅限于这些。任何类型的定义都可以放在类中,也可以放在包的顶层。如果您有一些助手方法,您希望处于整个包的作用域中,那么可以将它放在包的顶层。为此,您将定义放在一个包对象中。每个包允许有一个包对象。放置在包对象中的任何定义都被视为包本身的成员。

包对象 scala 包对象 scala已经有许多类型和值,因此我认为您可以对自己的类型使用相同的技术。

我不知道在这种情况下什么是友好,但这里有两个选择:

使用特征: (Scala 的无私特质模式)

trait RestfulTypes {
type Params = Map[String,String]
//...
}


object MyRestService extends RestService with RestfulTypes { /* ... */ }

或者只是导入对象的成员,有效地将其作为一个包来使用:

import util.RestfulTypes._

您可以使用包对象并将类型声明放在其中。当您导入该包时,类型定义将是可用的。

举个例子:

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

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

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

当您导入“ package”时,可以使用 mainType.mine 访问它

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