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

时间:2011-09-16 07:09:07

标签: scala types

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

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

我遇到的麻烦是这些类型定义需要存在于类或对象中 - 它们不像Haskell中的“一等公民”。如果我尝试在类或对象之外定义类型,我会得到一个编译器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大师认为类型只能在类/对象中定义是好事还是坏事?

3 个答案:

答案 0 :(得分:71)

package objects会为你效力吗?

来自文章:

  

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

package object scala已经有很多类型和值,所以我认为你可以为自己的类型使用相同的技术。

答案 1 :(得分:11)

我不确定在这种情况下是什么构成了好处,但这里有两个选项:

使用特征:(Scala's Selfless Trait Pattern

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

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

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

import util.RestfulTypes._

答案 2 :(得分:7)

您可以使用包对象并将类型声明放在那里。导入该包时,类型定义将可用。

一个例子:

//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